使用填充参数检查sql语句

时间:2014-04-14 20:00:25

标签: 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.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}";
}

2 个答案:

答案 0 :(得分:1)

替换sql语句的{0},{1},{2},{3}部分
@Type=@Type, @CaseID=@CaseID, @Worker=@Worker, @Name=@Name

sqlStatement方法中的参数格式适合使用.net string.Format方法,但您需要的是适合sp_executeSql的SQL参数映射的格式


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

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

答案 1 :(得分:0)

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

请参阅:http://msdn.microsoft.com/en-us/library/ms181091(v=sql.120).aspx