检查带有填充参数的sql语句
本文关键字:sql 语句 参数 填充 检查 | 更新日期: 2023-09-27 17:58:21
我有这个代码,编译器抛出这个错误:
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
方法,但您需要的是适合sp_executeSql的SQL参数映射的格式。
EDIT:如果不能修改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事件探查器捕获它。您可能希望在探查器中捕获SQL:BatchStarting事件,以查看代码实际传递给服务器的语句和参数。
请参阅:http://msdn.microsoft.com/en-us/library/ms181091(v=sql.120).aspx