C# System.Data.SqlClient.SqlException:';';附近的语法不正确';
这可能是与SQL相关的常见问题之一,但我很难弄清楚问题所在 我的当前代码出现错误: System.Data.dll中发生类型为“System.Data.SqlClient.SqlException”的未处理异常 “…”附近的语法不正确 SQL: C#:C# System.Data.SqlClient.SqlException:';';附近的语法不正确';,c#,sql,sql-server,C#,Sql,Sql Server,这可能是与SQL相关的常见问题之一,但我很难弄清楚问题所在 我的当前代码出现错误: System.Data.dll中发生类型为“System.Data.SqlClient.SqlException”的未处理异常 “…”附近的语法不正确 SQL: C#: 使用(OdbcConnection dbConnection1=新的OdbcConnection(connectionString1)) { dbConnection1.Open(); OdbcDataAdapter dadapter1=新的Od
使用(OdbcConnection dbConnection1=新的OdbcConnection(connectionString1))
{
dbConnection1.Open();
OdbcDataAdapter dadapter1=新的OdbcDataAdapter();
dadapter1.SelectCommand=newodbccommand(queryString1,dbConnection1);
数据1.填充(t1);
SqlConnection tempDbConnection=新建SqlConnection();
tempDbConnection.ConnectionString=@“数据源=(LocalDB)\MSSQLLocalDB;AttachDbFilename=| DataDirectory | \CustomerDatabase.mdf;集成安全性=True”;
tempDbConnection.Open();
字符串tempSql=“”;
对于(int i=0;i
编辑:
我对路径也有问题,应该是:
C:\Users\…\source\repos\…\CustomerDatabase.mdf
要回答您的问题,您在这一行缺少一个引号:
+ t1.Rows[i]["YRNRO"].ToString().Trim() + ",'"
//change to
+ t1.Rows[i]["YRNRO"].ToString().Trim() + "','"
但作为一名负责任的高级开发人员,我必须告诉您要么使用参数化SQL,要么将脚本封装在存储过程中并传递参数
可能是离题了,但要加快执行速度,请生成一个批量SQL脚本,然后一次性执行,而不是在foreach循环中执行。如其他人所述,最好尝试以下方法:
var connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\CustomerDatabase.mdf;Integrated Security=True";
string tempSql = "INSERT INTO LTEST (YRNRO,HAKUNIMI,NIMIA,NIMIB,KAYNTIOS,POSTIOS,POSTINRO) VALUES (@YRNRO, @HAKUNIMI, @NIMIA, @NIMIB, @KAYNTIOS, @POSTIOS, @POSTINRO)"
using (SqlConnection connection = new SqlConnection(connectionText))
{
SqlCommand command = new SqlCommand(commandText, connection);
command.Parameters.Add("@YRNRO", SqlDbType.Text);
command.Parameters.Add("@HAKUNIMI", SqlDbType.Text);
command.Parameters.Add("@NIMIA", SqlDbType.Text);
command.Parameters.Add("@NIMIB", SqlDbType.Text);
command.Parameters.Add("@KAYNTIOS", SqlDbType.Text);
command.Parameters.Add("@POSTIOS", SqlDbType.Text);
command.Parameters.Add("@POSTINRO", SqlDbType.Text);
connection.Open();
for (int i = 0; i < t1.Rows.Count; i++)
{
command.Parameters["@YRNRO"].Value = t1.Rows[i]["YRNRO"].ToString().Trim();
command.Parameters["@HAKUNIMI"].Value = t1.Rows[i]["@HAKUNIMI"].ToString().Trim();
command.Parameters["@NIMIA"].Value = t1.Rows[i]["@HAKUNIMI"].ToString().Trim();
command.Parameters["@NIMIB"].Value = t1.Rows[i]["@HAKUNIMI"].ToString().Trim();
command.Parameters["@KAYNTIOS"].Value = t1.Rows[i]["@HAKUNIMI"].ToString().Trim();
command.Parameters["@POSTIOS"].Value = t1.Rows[i]["@HAKUNIMI"].ToString().Trim();
command.Parameters["@POSTINRO"].Value = t1.Rows[i]["@HAKUNIMI"].ToString().Trim();
try
{
command.ExecuteNonQuery();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
connection.Close();
}
var connectionString=@“数据源=(LocalDB)\MSSQLLocalDB;AttachDbFilename=| DataDirectory | \CustomerDatabase.mdf;集成安全性=True”;
string tempSql=“插入LTEST(YRNRO、HAKUNIMI、NIMIA、NIMIB、KAYNTIOS、POSTIOS、POSTINRO)值(@YRNRO、@HAKUNIMI、@NIMIA、@NIMIB、@KAYNTIOS、@POSTINRO)”
使用(SqlConnection连接=新的SqlConnection(connectionText))
{
SqlCommand=newsqlcommand(commandText,connection);
Add(“@YRNRO”,SqlDbType.Text);
Add(“@HAKUNIMI”,SqlDbType.Text);
添加(“@NIMIA”,SqlDbType.Text);
Add(“@NIMIB”,SqlDbType.Text);
添加(“@KAYNTIOS”,SqlDbType.Text);
添加(“@POSTIOS”,SqlDbType.Text);
Add(“@POSTINRO”,SqlDbType.Text);
connection.Open();
对于(int i=0;i
使用参数!它不仅可以防止您再次遇到类似问题,同时可能提高性能,还可以保护您的数据库免受SQL注入攻击(没有理由不使用参数,除非演示参数有多好)是的,参数化查询,甚至不会发生此错误,它保护您的应用程序。双赢家。错误消息不会在“接近”之后停止,而是在“接近”之后显示相关部分。在你的情况下,这是一个缺少的单一报价,但不要这样做,因为其他人已经说过。当用户输入包含一个引号或允许用户执行SQL注入时,这将中断。您在运行时查看过tempSql的值吗?我完全赞同Franz所说的,但仅仅通过查看代码是不可能看到代码将产生什么的。@Crowcoder“仅仅通过查看代码是不可能看到代码将产生什么的”-这是我们在这个网站上每天都做的事情。谢谢你!我想应该是SqlDbType.Text
,因为SqlDbType不支持字符串。当我将数据从datatable粘贴到SQL时,如何在您的解决方案中从datatable读取数据?谢谢,您当然是正确的。您可以做的是在行上循环并更新参数值,或者使用类似SqlBulkCopy的东西。
+ t1.Rows[i]["YRNRO"].ToString().Trim() + ",'"
//change to
+ t1.Rows[i]["YRNRO"].ToString().Trim() + "','"
var connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\CustomerDatabase.mdf;Integrated Security=True";
string tempSql = "INSERT INTO LTEST (YRNRO,HAKUNIMI,NIMIA,NIMIB,KAYNTIOS,POSTIOS,POSTINRO) VALUES (@YRNRO, @HAKUNIMI, @NIMIA, @NIMIB, @KAYNTIOS, @POSTIOS, @POSTINRO)"
using (SqlConnection connection = new SqlConnection(connectionText))
{
SqlCommand command = new SqlCommand(commandText, connection);
command.Parameters.Add("@YRNRO", SqlDbType.Text);
command.Parameters.Add("@HAKUNIMI", SqlDbType.Text);
command.Parameters.Add("@NIMIA", SqlDbType.Text);
command.Parameters.Add("@NIMIB", SqlDbType.Text);
command.Parameters.Add("@KAYNTIOS", SqlDbType.Text);
command.Parameters.Add("@POSTIOS", SqlDbType.Text);
command.Parameters.Add("@POSTINRO", SqlDbType.Text);
connection.Open();
for (int i = 0; i < t1.Rows.Count; i++)
{
command.Parameters["@YRNRO"].Value = t1.Rows[i]["YRNRO"].ToString().Trim();
command.Parameters["@HAKUNIMI"].Value = t1.Rows[i]["@HAKUNIMI"].ToString().Trim();
command.Parameters["@NIMIA"].Value = t1.Rows[i]["@HAKUNIMI"].ToString().Trim();
command.Parameters["@NIMIB"].Value = t1.Rows[i]["@HAKUNIMI"].ToString().Trim();
command.Parameters["@KAYNTIOS"].Value = t1.Rows[i]["@HAKUNIMI"].ToString().Trim();
command.Parameters["@POSTIOS"].Value = t1.Rows[i]["@HAKUNIMI"].ToString().Trim();
command.Parameters["@POSTINRO"].Value = t1.Rows[i]["@HAKUNIMI"].ToString().Trim();
try
{
command.ExecuteNonQuery();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
connection.Close();
}