簡體   English   中英

System.Data.SqlClient.SqlException:''...'附近的語法不正確

[英]System.Data.SqlClient.SqlException: 'Incorrect syntax near '…'

這可能是與 SQL 相關的常見問題之一,但是我很難弄清楚問題所在。

我當前的代碼給出了一個錯誤:

System.Data.dll 中出現“System.Data.SqlClient.SqlException”類型的未處理異常“...”附近的語法不正確。

SQL:

CREATE TABLE [dbo].[LTEST] (
    [Id]       INT  NOT NULL,
    [YRNRO]    INT  NULL,
    [HAKUNIMI] TEXT NULL,
    [NIMIA]    TEXT NULL,
    [NIMIB]    TEXT NULL,
    [KAYNTIOS] TEXT NULL,
    [POSTIOS]  TEXT NULL,
    [POSTINRO] TEXT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

C#:

        using (OdbcConnection dbConnection1 = new OdbcConnection(connectionString1))
        {
            dbConnection1.Open();
            OdbcDataAdapter dadapter1 = new OdbcDataAdapter();
            dadapter1.SelectCommand = new OdbcCommand(queryString1, dbConnection1);

            dadapter1.Fill(t1);

            SqlConnection tempDbConnection = new SqlConnection();
            tempDbConnection.ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\CustomerDatabase.mdf;Integrated Security=True";
            tempDbConnection.Open();

            string tempSql = "";
            for (int i = 0; i < t1.Rows.Count; i++)
            {
                tempSql = "INSERT INTO LTEST (YRNRO,HAKUNIMI,NIMIA,NIMIB,KAYNTIOS,POSTIOS,POSTINRO) VALUES ('"
                            + t1.Rows[i]["YRNRO"].ToString().Trim() + ",'"
                            + t1.Rows[i]["HAKUNIMI"].ToString().Trim() + "','"
                            + t1.Rows[i]["NIMIA"].ToString().Trim() + "','"
                            + t1.Rows[i]["NIMIB"].ToString().Trim() + "','"
                            + t1.Rows[i]["KAYNTIOS"].ToString().Trim() + "',"
                            + t1.Rows[i]["POSTIOS"].ToString().Trim() + "',"
                            + t1.Rows[i]["POSTINRO"].ToString().Trim() + ");'";
                SqlCommand tempCommand = new SqlCommand(tempSql, tempDbConnection);
                tempCommand.ExecuteNonQuery();
            }

        }

編輯:

我的路徑也有問題,應該是: C:\Users\...\source\repos\...\...\CustomerDatabase.mdf

正如其他人所提到的,最好嘗試這樣的事情:

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

要回答您的問題,您在此行缺少單引號:

 + t1.Rows[i]["YRNRO"].ToString().Trim() + ",'"
//change to
 + t1.Rows[i]["YRNRO"].ToString().Trim() + "','"

但作為一個負責任的高級開發人員,我必須告訴您要么使用參數化的 SQL,要么將您的腳本包裝在存儲過程中並傳遞參數。

也許題外話,但為了加快執行速度,生成一個大容量 SQL 腳本,然后一次性執行,而不是在 foreach 循環中執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM