繁体   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