C# 检查带有填充参数的sql语句
我有此代码,编译器抛出此错误: SqlException:“0”附近的语法不正确 我找不到SQL Server使用的导致此错误的实际SQL语句 有没有一种方法可以让我获得带有参数的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
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
方法中的参数格式适合使用.netstring.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事件仍然会发生-很抱歉错误引导!