![](/img/trans.png)
[英]How to use a parameter for a SQL Server query that is part of the query itself using SqlDataReader in C# asp.net
[英]Problem executing query for SQL Server in C# with SQLDataReader
我正在嘗試使用SqlDataReader
在C#中執行查詢,但是我從數據庫收到一條錯誤消息,“ '附近的語法不正確'。' ”。
我不確定我的SQL查詢有什么問題。 我可以在SQL Server Management Studio中完美地執行它。
try
{
SqlConnection thisConnection = new SqlConnection();
thisConnection.Open();
SqlCommand thisCommand = thisConnection.CreateCommand();
thisCommand.CommandText = "SELECT"
+"db.name DBName,"
+"tl.request_session_id,"
+"wt.blocking_session_id,"
+"OBJECT_NAME(p.OBJECT_ID) BlockedObjectName,"
+"tl.resource_type,"
+"h1.TEXT AS RequestingText,"
+"h2.TEXT AS BlockingText,"
+"tl.request_mode"
+"FROM sys.dm_tran_locks AS tl"
+"INNER JOIN sys.databases db ON db.database_id = tl.resource_database_id"
+"INNER JOIN sys.dm_os_waiting_tasks AS wt ON tl.lock_owner_address = wt.resource_address"
+"INNER JOIN sys.partitions AS p ON p.hobt_id = tl.resource_associated_entity_id"
+"INNER JOIN sys.dm_exec_connections ec1 ON ec1.session_id = tl.request_session_id"
+"INNER JOIN sys.dm_exec_connections ec2 ON ec2.session_id = wt.blocking_session_id"
+"CROSS APPLY sys.dm_exec_sql_text(ec1.most_recent_sql_handle) AS h1"
+"CROSS APPLY sys.dm_exec_sql_text(ec2.most_recent_sql_handle) AS h2";
SqlDataReader thisReader = thisCommand.ExecuteReader();
while (thisReader.Read())
{
Console.WriteLine("\t{0}\t{1}", thisReader["DBName"], thisReader["BlockedObjectName"]);
}
thisReader.Close();
thisConnection.Close();
}
catch (SqlException e)
{
Console.WriteLine(e.Message);
}
在連接的某些行的末尾需要空格:
例如:
+"tl.request_mode"
+"FROM sys.dm_tran_locks AS tl"
將創建SQL
...tl.request_modeFROM sys.dm_tran_locks AS tl...
將其更改為
+"tl.request_mode "
+"FROM sys.dm_tran_locks AS tl"
還有一些其他行具有相同的問題。
這是一個很好的例子,說明為什么在測試動態構建的SQL字符串時實際打印出連接字符串非常重要,而不是僅僅粘貼代碼並編輯引號和+符號。
正如約翰所提到的那樣,你需要在行的末尾留出空格,因為你缺少一些空格。
例如,您的初始錯誤來自前兩行
thisCommand.CommandText = "SELECT"
+"db.name DBName,"
這將是平等的
SELECTdb.name DBName,
那就是“ 不正確的語法附近 '。'”來自db。 正被添加到SELECT語句中。
JohnFx和kevchadders是正確的,錯誤是由於結果字符串沒有適當的空格。 至於你可以做些什么 - 如果你希望查詢保持或多或少的格式相同,你可以使用@ -quoting:
thisCommand.CommandText =
@"SELECT
db.name DBName,
tl.request_session_id,
wt.blocking_session_id,
OBJECT_NAME(p.OBJECT_ID) BlockedObjectName,
tl.resource_type,
h1.TEXT AS RequestingText,
h2.TEXT AS BlockingText,
tl.request_mode
FROM sys.dm_tran_locks AS tl
INNER JOIN sys.databases db ON db.database_id = tl.resource_database_id
INNER JOIN sys.dm_os_waiting_tasks AS wt ON tl.lock_owner_address = wt.resource_address
INNER JOIN sys.partitions AS p ON p.hobt_id = tl.resource_associated_entity_id
INNER JOIN sys.dm_exec_connections ec1 ON ec1.session_id = tl.request_session_id
INNER JOIN sys.dm_exec_connections ec2 ON ec2.session_id = wt.blocking_session_id
CROSS APPLY sys.dm_exec_sql_text(ec1.most_recent_sql_handle) AS h1
CROSS APPLY sys.dm_exec_sql_text(ec2.most_recent_sql_handle) AS h2
";
SqlDataReader thisReader = thisCommand.ExecuteReader();
這將尊重您的行結束和其他空格,因此您可以獲得可讀的查詢,您可以輕松地從C#復制粘貼到SSMS中,沒有空白錯誤,沒有連接,也沒有所有StringBuilder.Append語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.