Что не так с этим запросом SQL? - PullRequest
0 голосов
/ 23 декабря 2009

Я запускаю этот запрос

"insert into students (StudentName) values ('reza');insert into  Records (RecordValue,StudentID)" +
            " values (20,@@IDENTITY)";

в C # и получите следующее исключение:

Characters found after end of SQL statement

Ответы [ 5 ]

4 голосов
/ 23 декабря 2009

Полагаю, вы хотите получить личность вновь вставленного студента, а затем вставить ее в таблицу «Записи», верно?

Я настоятельно рекомендую вам использовать SCOPE_IDENTITY() вместо @@ IDENTITY, что вызывает некоторые проблемы, например, если у вас есть, например. триггеры на вашем столе. У Пинала Дейва есть отличное сообщение в блоге об этих проблемах.

Кроме того, если вы вызываете SQL Server из C #, я настоятельно рекомендую вам использовать собственный .NET SQL Provider (SqlConnection, SqlCommand и т. Д.), А не oledbcommand.

Попробуйте это

using (SqlConnection _con = new SqlConnection("server=(local);database=TEST;integrated security=SSPI;"))
{
    string queryStmt = "INSERT INTO dbo.Students (StudentName) VALUES('reza'); " +
                       "INSERT INTO dbo.Records(RecordID, StudentID) VALUES (20, SCOPE_IDENTITY());";

    using (SqlCommand _cmd = new SqlCommand(queryStmt, _con))
    {
       try
       {
            _con.Open();
            _cmd.ExecuteNonQuery();
            _con.Close();
       }
       catch (Exception exc)
       {
           string msg = exc.Message;
       }
    }
 }

Это, безусловно, работает, я только что успешно проверил его в моей настройке.

1 голос
/ 23 декабря 2009

Вы можете выполнить эту команду, как показано на рисунке - вам не нужно иметь временную переменную, а также вам не нужно вводить "GO" или пробел после точки с запятой. Я согласен с Marc_s в том, что вам следует использовать SCOPE_IDENTITY (), чтобы избежать проблем с другими транзакциями, утаившими значение.

Вопрос в том, почему у вас есть кавычки вокруг вашего утверждения и точка с запятой в конце? Ясно, что вы извлекаете это из кода, и , где - это то, куда я посмотрю. Итак ... сначала запустите эту команду в SQL Server Management Studio или т.п., чтобы убедиться, что она работает. Как только вы это подтвердите (это должно сработать, если предположить, что структура вашей таблицы соответствует моей) , тогда выясните, что делает ваш код неправильно.

Обновление: я смеюсь здесь, поскольку мой ответ «исправляет» множество других ответов, которые исчезают, когда становится очевидным, что они не правы.

1 голос
/ 23 декабря 2009

Вы должны заключить это в хранимую процедуру, потому что по логике это одна единица работы - и вы можете вызывать ее также из более чем одного места.

Я бы также серьезно подумал о том, следует ли вам объединить два утверждения в транзакцию - вы не хотели бы, чтобы вставка вставлялась в учащихся успешно, а вставка в записи - неудачно. Да, это крайнее условие, но в SP легко защититься и он делает код более профессиональным.

Еще одно преимущество использования SP в этом случае состоит в том, что, поскольку вы уже выполняете несколько операций вставки, вполне возможно, что вы захотите расширить это позже - например, вставку в таблицу финансов. Если вы завершили SP, вы можете просто изменить SP вместо того, чтобы искать код для всех экземпляров новой вставки, изменения и перекомпиляции нового ученика.

1 голос
/ 23 декабря 2009

Я только что запустил этот код, и он сработал:

SqlConnection cn = new SqlConnection("...");
SqlCommand cm = cn.CreateCommand();
cm.CommandText = 
    "INSERT INTO MyTable (FieldA) VALUES ('Sample'); " +
    "INSERT INTO MyTable (FieldB) VALUES (@@Identity); ";
cn.Open();
cm.ExecuteNonQuery();

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

0 голосов
/ 23 декабря 2009

Вам необходимо создать хранимую процедуру, содержащую эти операторы SQL, а затем выполнить хранимую процедуру из кода C #.

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