2015-09-25 59 views
1

在我的ASP.NET應用程序,我有以下SQL其中工程:在SQL語句中使用user.identity.Name

<asp:SqlDataSource ID="ISESDatabase" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT [id], [Word], [Definition], [Example] FROM [gridData] WHERE [Strategy]='Vocabulary'"> 

不過,我需要一個用戶ID檢查添加到Where子句和我希望使用user.identity.Name來執行檢查。我曾嘗試以下,但它不工作:

<asp:SqlDataSource ID="ISESDatabase" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT [id], [Word], [Definition], [Example] FROM [gridData] WHERE [userid]= /'" + user.identity.Name + "/' AND [Strategy]='Vocabulary'"> 

以下是錯誤:

分析器錯誤 說明:該請求提供服務所需資源的分析過程中發生錯誤。請檢查以下特定的分析錯誤詳細信息並適當修改您的源文件。

解析器錯誤消息:服務器標記格式不正確。

源錯誤:

Line 46:    <asp:SqlDataSource ID="ISESDatabase" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT [id], [Word], [Definition], [Example] FROM [gridData] WHERE [userid]=/'" + User.Identity.Name + "/' AND [Strategy]='Vocabulary'"> 

我在做什麼錯?

+0

爲什麼你周圍用'/'S中USENAME? – Mureinik

+0

已刪除並出現以下錯誤: 解析器錯誤 說明:解析服務此請求所需的資源時發生錯誤。請檢查以下特定的分析錯誤詳細信息並適當修改您的源文件。 解析器錯誤消息:服務器標記格式不正確。Line 46:」SelectCommand =「SELECT [id],[Word],[Definition],[Example] FROM [gridData] WHERE [userid] ='「+ User.Identity.Name +」'AND [Strategy] ='Vocabulary'「> – sroonet

回答

1

我認爲您需要重新考慮您的方法。而不是嘗試在asp:SqlDataSource元素中'硬編碼''user.Identity.Name'屬性,嘗試創建一個參數來保存此值:

1)將'user.Identity.Name'替換爲您的使用參數的標記SelectCommand,如「@Name」。

2)然後爲名稱爲'Name'的asp:SqlDataSource定義一個SelectParameter元素。將參數的Type屬性設置爲'user.Identity.Name'的數據類型。

3)然後,您可以定義要在SqlDataSource的Selecting事件的事件處理程序中以編程方式選擇的值。

下面是一個有效的例子。下面的代碼片段是從aspx頁面:

<asp:GridView ID="myGridView" runat="server" DataSourceID="myDataSource" DataKeyNames="ID"></asp:GridView> 
<asp:SqlDataSource ID="myDataSource" runat="server" 
    SelectCommand="SELECT * FROM [Users] WHERE [Name] = @Name" 
    ConnectionString='Data Source=(LocalDB)\v11.0;AttachDbFilename="c:\users\windowsLogin\documents\visual studio 2012\Projects\WebApplication1\WebApplication1\App_Data\Database1.mdf";Integrated Security=True'> 
    <SelectParameters> 
     <asp:Parameter Name="Name" Type="Int32" /> 
    </SelectParameters> 
</asp:SqlDataSource> 

然後,在代碼隱藏,你可以在運行時無論基於何種標準關係編程定義參數。 (在這裏,我只是將值「2」到@Name參數;你可以用「user.Identity.Name」更換)

Private Sub myDataSource_Selecting(sender As Object, e As SqlDataSourceSelectingEventArgs) Handles myDataSource.Selecting 
    e.Command.Parameters("@Name").Value = 2 
End Sub 

我希望這是明確的...如果沒有請參閱MSDN上的文檔。這裏有幾頁,讓您開始:

SqlDataSource.SelectCommand Property

SqlDataSourceSelectingEventArgs Class

,更普遍,

Using Parameters with Data Source Controls for Filtering

+0

謝謝,詹姆斯。你搖滾! – sroonet

+0

很好想出答案。謝謝。 – Tyddlywink

0

要轉義字符串中的特殊字符是使用反斜槓'\'不是正斜槓'/'。試試看看它是否有效:

<asp:SqlDataSource ID="ISESDatabase" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT [id], [Word], [Definition], [Example] FROM [gridData] WHERE [userid]= \'" + user.identity.Name + "\' AND [Strategy]='Vocabulary'"> 

更新:答案是不是這麼簡單,如sroonet測試。實際的答案是在SelectCommand中使用參數化查詢。有關在SelectCommand中使用參數化查詢的詳細信息,請參閱以下網頁: https://msdn.microsoft.com/en-us/library/z72eefad.aspx

+0

作出了建議更改,現在得到: 解析器錯誤 說明:解析期間發生錯誤爲請求提供服務所需的資源。請檢查以下特定的分析錯誤詳細信息並適當修改您的源文件。 解析器錯誤消息:服務器標記格式不正確。第一行,第二行,第三行,第三行,第三行,第三行,第三行,第三行,第三行,第三行,第三行,第三行,第三行,第三行,第三行,第三行,第三行,第三行, FROM [gridData] WHERE [userid] = \'「+ User.Identity.Name +」\'AND [Strategy] ='Vocabulary'「> – sroonet

+0

好吧,我做了一些研究,問題並不那麼簡單。基本上,你不能在SelectCommand屬性中進行字符串連接,按照這個鏈接(http://stackoverflow.com/questions/1112371/net-sqldatasource-tag-selectcommand)。你可能想要嘗試的是遵循這個帖子:https://msdn.microsoft.com/en-us/library/z72eefad.aspx使用參數化查詢。 –

+0

謝謝,亨利。參數化的查詢有訣竅。 – sroonet