0

短的:

我的 C# 代码中的 SQL 语句不起作用。with(nolock)正在破坏代码。

详细的:

以下是我的错误和出现错误的代码。该代码应该连接到我的 SQL Server 数据库(连接代码工作正常)然后运行查询。此查询将获取所有具有“blah”uri 的事件的 IP 地址。问题似乎是我with(nolock)需要使用的命令。我必须使用它,因为它是所有 T-SQL 查询的组标准。

我用谷歌搜索了一段时间,但似乎没有什么适合我的问题,而且我发现的修复还没有奏效。对我的代码或链接的任何帮助将不胜感激。

错误:

System.Data.SqlClient.SqlException 在关键字“with”附近被捕获消息=语法不正确。如果此语句是公用表表达式、xmlnamespaces 子句或更改跟踪上下文子句,则前面的语句必须以分号结束。
Source=.Net SqlClient 数据提供程序 ErrorCode=-2146232060 Class=15 LineNumber=1 Number=319 Procedure="" Server= State=1

代码:

try
{
   //create sql reader to display data
   SqlDataReader myReader = null;

   //create string to enter data into database
   string insString = @"select c_ip from @dates with(nolock) where cs_uri like 'blah'";
   SqlCommand myCommand = new SqlCommand(insString, DbConnection);

   //populate and sanitize parameters
   myCommand.Parameters.Add("@dates", SqlDbType.VarChar, 100);
   myCommand.Parameters["@dates"].Value = currentdate;

   //execute the command
   myReader = myCommand.ExecuteReader();

   //read all results and print them to output
   while (myReader.Read())
   {
      //get IPs              
      String ipmix = myReader["c_ip"].ToString();
      mainIPs.Add(ipmix);
   }
}
catch (Exception e)
{
   Console.WriteLine("The query connection to the datebase has timed out.\n");
   Console.WriteLine(e.ToString());
   Console.ReadLine();
}

解决方案:

更改代码:

//create string to enter data into database
string insString = @"select c_ip from @dates with(nolock) where cs_uri like 'blah'";

至:

//create string to enter data into database
string insString = @"select c_ip from " + currentdate + " with(nolock) where cs_uri like '%blah'";
4

3 回答 3

8

它不是 WITH,而是 @dates 变量。您基本上是在创建语句....

select c_ip from '12/28/2011 15:35:22.997' with(nolock) where cs_uri like 'blah'

这没有任何意义。

此外,您给用户的异常消息并不正确。错误可能是任何数量的东西(比如“不正确的语法”),但你告诉他们这是一个超时问题。

根据您的评论,您应该将查询文本更改为...

string insString = @"select c_ip from " + currentdate + " with(nolock) where cs_uri = 'blah'";

由于您是在代码中生成 currentdate 值,而不是从任何用户输入中生成,因此您不会面临 SQL 注入的风险。取出like并用equals替换它也会提高查询性能。此外,完全删除参数。

于 2011-12-28T21:50:32.660 回答
1

在构建选择语句时摆脱参数代码并添加表名

string insString = @"select c_ip from " + currentdate + " with(nolock) where cs_uri like 'blah'";
于 2011-12-28T21:57:59.290 回答
1

您已要求它从名为 的表中选择记录@Dates。(这是日期参数) - 将评估为

select 'c_ip from 28-12-2011...'

你可能想要类似的东西

“从 logtable 中选择 c_ip with (nolock) where cs_uri like 'blah' and log_date=@dates

不要忘记日期,如果您使用DATETIME字段,则由日期和时间组件组成,因此您可能还想构建一个相关的日期范围从00:00:00to 23:59:59(或用于currentdate+1捕捉午夜重叠)

那给你

select c_ip from logtable with(nolock) where (cs_uri like '%blah%') and (log_date between @startdate and @enddate)
于 2011-12-28T21:58:38.747 回答