Ошибка синтаксиса параметризованных значений SQL - PullRequest
0 голосов
/ 24 июня 2011

Я не уверен, в чем проблема, но мой код выглядит так:

function() {
string sqltext2;
sqltext2 = "INSERT into myTable";
SqlCommand myCommand2 = new SqlCommand(sqltext2, MyConnection2);

if (cond1) {

    sqltext2 = sqltext2 + "SELECT" + "@initOwnerFirstName" + "," + "@ownerFirstName"  + "UNION ALL ";
    SqlParameter param = new SqlParameter();
    param.ParameterName = "@initOwnerFirstName";
    param.Value = initOwnerFirstName;
    SqlParameter param2 = new SqlParameter();
    param2.ParameterName = "@ownerFirstName";
    param2.Value = owner.FirstName;
    myCommand2.Parameters.Add(param);
    myCommand2.Parameters.Add(param2);

Я полностью новичок в параметризованном SQL, но синтаксис мне кажется правильным. Ошибка, которую я продолжаю получать:

Должен объявлять скалярную переменную "@initOwnerFirstName". Причина, по которой я пишу такое утверждение, заключается в том, что я собираюсь использовать несколько других операторов if, которые добавят в SQLtext

РЕДАКТИРОВАТЬ: Вот полная часть кода после оператора if, так как мой синтаксис не имеет смысла без других переменных. Это исправлено после того, что предложил Йелтон, но я все еще получаю ту же ошибку.

sqltext2 = sqltext2 + "SELECT" + "'" + currentUserId2 + "'," + "'" +  owner.Id.ToString() + "'," + "'" + DateTime.Now + "'," + "'FirstName', @initOwnerFirstName, @ownerFirstName UNION ALL ";
myCommand2.Parameters.AddWithValue("initOwnerFirstName", initOwner.FirstName);
myCommand2.Parameters.AddWithValue("OwnerFirstName", owner.FirstName);

Ответы [ 2 ]

2 голосов
/ 24 июня 2011

Вот как работают параметризованные запросы:

using (SqlConnection conn = new SqlConnection("connectionstring"))
{
    using SqlCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = @"INSERT INTO mytable
            (initOwnerFirstName, ownerFirstName)
            VALUES (@initOwnerFirstName, @ownerFirstName);";
        cmd.Parameters.AddWithValue("initOwnerFirstName", initOwner.FirstName);
        cmd.Parameters.AddWithValue("ownerFirstName", owner.FirstName);
        // ... execute query
    }
}

Похоже, вы вставляете в myTable результаты оператора SELECT, но вы пытаетесь передать параметры туда, куда должны идти имена столбцов,Параметр заменит @variablename значением, таким образом: параметры для значений, а не имен столбцов.

Для нескольких значений используйте скобки, чтобы указать набор, разделенный запятыми:

INSERT INTO mytable (col1, col2) VALUES ("a", "b"), ("c", "d"), ("e", "f");

Вы можете соответствующим образом изменить строку запроса для соответствия этому синтаксису.

Дополнительная информация: Синтаксис SQL-вставки

2 голосов
/ 24 июня 2011

Проблема может заключаться в том, что вы объединяете свои строки без пробелов.Вам не нужно объединять либо.Смотрите мое обновление ниже:

function() {
string sqltext2;
sqltext2 = "INSERT into dbo.OwnerChanges ";
SqlCommand myCommand2 = new SqlCommand(sqltext2, MyConnection2);

if (cond1) {
    //no concatenating
    sqltext2 = sqltext2 + " SELECT @initOwnerFirstName , @ownerFirstName UNION ALL ";
    SqlParameter param = new SqlParameter();
    param.ParameterName = "@initOwnerFirstName";
    param.Value = initOwnerFirstName;
    SqlParameter param2 = new SqlParameter();
    param2.ParameterName = "@ownerFirstName";
    param2.Value = owner.FirstName;
    myCommand2.Parameters.Add(param);
    myCommand2.Parameters.Add(param2);

Я не уверен, что делает остальная часть вашего кода, но я подозреваю, что вы оставляете завершающий UNION ALL в конце всего этого.Вы могли бы выиграть, просто поместив каждый подзапрос в массив и используя String.Join .

ОБНОВЛЕНИЕ:

Я думаю, что яувидеть проблему.Вам нужно обновить CommandText, а не исходную строку.Поэтому измените это:

sqltext2 = sqltext2 + " SELECT @initOwnerFirstName , @ownerFirstName UNION ALL ";

на это:

myCommand2.CommandText= sqltext2 + " SELECT @initOwnerFirstName , @ownerFirstName UNION ALL ";

...