C# 检查带有填充参数的sql语句

C# 检查带有填充参数的sql语句,c#,sql-server,tsql,C#,Sql Server,Tsql,我有此代码,编译器抛出此错误: SqlException:“0”附近的语法不正确 我找不到SQL Server使用的导致此错误的实际SQL语句 有没有一种方法可以让我获得带有参数的SQL语句来重现错误并修复它?或者我的代码有问题 void Main() { DataTable table = new DataTable("Task"); table.Columns.Add("ID"); table.Columns.Add("Type"); table.Column

我有此代码,编译器抛出此错误:

SqlException:“0”附近的语法不正确

我找不到SQL Server使用的导致此错误的实际SQL语句

有没有一种方法可以让我获得带有参数的SQL语句来重现错误并修复它?或者我的代码有问题

void Main()
{
    DataTable table = new DataTable("Task");
    table.Columns.Add("ID");
    table.Columns.Add("Type");
    table.Columns.Add("Worker");    
    table.Columns.Add("CaseID");
    table.Columns.Add("Name");

    DataRow row1 = table.NewRow();
    row1["Type"]="Type1";
    row1["Worker"]="ABCD";
    row1["CaseID"] = "1234567";
    row1["Name"] = "ABC";
    table.Rows.Add( row1 );



    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
    sqlDataAdapter.InsertCommand = new SqlCommand( sqlStatement(),(SqlConnection)Connection);
    sqlDataAdapter.InsertCommand.CommandType = CommandType.Text;

    sqlDataAdapter.RowUpdating += new SqlRowUpdatingEventHandler(da_RowUpdating);

    sqlDataAdapter.InsertCommand.Parameters.Add( "@Type",SqlDbType.VarChar,4, "Type" );
    sqlDataAdapter.InsertCommand.Parameters.Add( "@Worker",SqlDbType.VarChar,4, "Worker" );
    sqlDataAdapter.InsertCommand.Parameters.Add( "@CaseID",SqlDbType.VarChar,7, "CaseID" );
    sqlDataAdapter.InsertCommand.Parameters.Add( "@Name",SqlDbType.VarChar,50, "Name" );

    sqlDataAdapter.Update( table );
}

static void da_RowUpdating(object sender, SqlRowUpdatingEventArgs e)
{
  Console.WriteLine("\nRow Updating...");
  Console.WriteLine("Command text: \n{0}", e.Command.CommandText);
  Console.WriteLine("\nParameters:");
  foreach (SqlParameter p in e.Command.Parameters)
  {
      Console.WriteLine("\t{0} - {1}", p.ParameterName, p.Value);
  }
}
string sqlStatement()
{
    return @"EXECUTE sp_executesql
    N'INSERT  INTO Task
            (
                Type,
              CaseID,
              Worker,
              Name
            )
    VALUES  (
@Type,
              @CaseID,
              @Worker,
              @Name
            );
SELECT SCOPE_IDENTITY() AS ID',
N'
     @Type varchar(7),
    @CaseID CHAR(7),
    @Worker CHAR(6),
    @Name VARCHAR(50)
    ',{0},{1},{2},{3}";
}

将sql语句的
{0}、{1}、{2}、{3}
部分替换为

@Type=@Type, @CaseID=@CaseID, @Worker=@Worker, @Name=@Name
sqlStatement
方法中的参数格式适合使用.net
string.format
方法,但您需要的是适合的SQL参数映射格式


编辑:如果不能修改
sqlStatement
,可以使用所需的参数将其提供给
string.Format
方法。我的猜测是,如果代码中已经使用了,那么它已经存在。无论如何,它应该是这样的:

string statement = string.Format(sqlStatement(), "@Type=@Type", "@CaseID=@CaseID", "@Worker=@Worker", "@Name=@Name");
sqlDataAdapter.InsertCommand = new SqlCommand(statement,(SqlConnection)Connection);

不必对您的特定代码发表评论—通常,查看实际执行的SQL的100%有效方法是使用SQL Profiler捕获它。您可能希望在探查器中捕获SQL:BatchStarting事件,以查看代码实际传递给服务器的语句和参数


请参阅:

它在哪一行抛出异常?它真的是由编译器抛出的吗?这似乎是运行时错误…为什么不替换
参数。将
方法添加为
参数。AddWithValue
方法,让数据库处理数据类型的确定。我还将创建一个存储过程来处理Sql插入,并稍微清理代码,使其更具可读性,即使您自己也可以使用服务器端的SQL Server探查器,以查看执行的SQL语句。但是SQL语句没有(正如许多开发人员所期望的那样)“扩展”;e、 g.参数值不会插入到实际的SQL中-SQL语句会随参数一起发送到SQL Server-因此,在C#代码中的SQL语句与SQL Server端的SQL语句之间不会有太大的差异。sqlDataAdapter.Update(表)会引发异常;sql语句被许多其他地方使用,我无法修改它。我使用了您提供的方式给我错误:字符文字中的字符太多对不起,输入错误(had'而不是'我也尝试过双引号,或者双引号中的单引号。没有任何效果。仍然会给我相同的错误消息。结果发现我遗漏了一些东西。这是我的错。你的解决方案确实有效。谢谢!!!我在运行代码时检查了SQL探查器,但它没有显示在探查器中。是因为编译错误,所以sql server甚至没有运行它?嗯…我的印象是BatchStarted事件仍然会发生-很抱歉错误引导!