簡體   English   中英

使用SQLDataReader在C#中執行SQL Server查詢時出現問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM