Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Data.SqlClient.SqlException:';';附近的语法不正确';_C#_Sql_Sql Server - Fatal编程技术网

C# System.Data.SqlClient.SqlException:';';附近的语法不正确';

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

这可能是与SQL相关的常见问题之一,但我很难弄清楚问题所在

我的当前代码出现错误:

System.Data.dll中发生类型为“System.Data.SqlClient.SqlException”的未处理异常 “…”附近的语法不正确

SQL:

C#:

使用(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();
}