System.Data.SqlClient.SqlException: 'Неверный синтаксис рядом с' ... ' - PullRequest
0 голосов
/ 26 мая 2020

Вероятно, это один из распространенных вопросов, связанных с SQL, однако мне сложно понять, в чем проблема.

Мой текущий код выдает ошибку:

Необработанное исключение типа 'System.Data.SqlClient.SqlException' в System.Data.dll Неправильный синтаксис рядом с '...'.

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

Ответы [ 2 ]

4 голосов
/ 26 мая 2020

Как уже упоминалось, лучше попробуйте что-то вроде этого:

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

1 голос
/ 26 мая 2020

Чтобы ответить на ваш вопрос, у вас отсутствует одинарная кавычка в этой строке:

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

Но, как ответственный старший разработчик, я ДОЛЖЕН сказать вам либо использовать параметризованный SQL, либо обернуть ваш скрипт в хранимой процедуре и передать ей параметры.

И, возможно, выключить topi c, но для ускорения выполнения сгенерируйте массовый SQL скрипт, а затем выполните все сразу, а не внутри foreach l oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...