В INSERT меньше столбцов, это не ответ - PullRequest
0 голосов
/ 30 июня 2010

У меня есть приложение, которое конвертирует одну базу данных в другую, и одна из функций, которые я использую, это insert_Note ниже. В этом приложении есть несколько потоков, которые вставляют разные данные в новую базу данных. Приведенный ниже код работает для ряда вставок в диапазоне от 24 до 120, но затем завершается с ошибкой:

В операторе INSERT меньше столбцов, чем значений, указанных в предложении VALUES. Количество значений в предложении VALUES должно соответствовать количеству столбцов, указанному в операторе INSERT.

Если вы посмотрите на код, то увидите, что это не может быть проблемой, поскольку код работает для некоторых вставок, но не для всех. Что еще может вызвать эту ошибку в многопоточном приложении? Любые идеи будут приветствоваться, так как я потратил три дня на это и не получил никуда!

*Public sub insert_Note
    Dim sql As String
    Dim cmd As New SqlClient.SqlCommand
    sql = "INSERT INTO notes ("
    sql &= "RefID,"
    sql &= "TypeID,"
    sql &= "DateEntered,"
    sql &= "Username,"
    sql &= "Subject,"
    sql &= "Body,"
    sql &= "DoNotSendToWeb,"
    sql &= "Deleted,"
    sql &= "SubTypeID"
    sql &= ")  VALUES ("
    sql &= "@RefID,"
    sql &= "@TypeID,"
    sql &= "@DateEntered,"
    sql &= "@Username,"
    sql &= "@Subject,"
    sql &= "@Body,"
    sql &= "@DoNotSendToWeb,"
    sql &= "@Deleted,"
    sql &= "@SubTypeID"
    sql &= ")"
    cmd.CommandText = sql
    cmd.Parameters.AddWithValue("@RefID", 0)
    cmd.Parameters.AddWithValue("@TypeID", 0)
    cmd.Parameters.AddWithValue("@DateEntered", DBNull.Value)
    cmd.Parameters.AddWithValue("@Username", DBNull.Value)
    cmd.Parameters.AddWithValue("@Subject", DBNull.Value)
    cmd.Parameters.AddWithValue("@Body", DBNull.Value)
    cmd.Parameters.AddWithValue("@DoNotSendToWeb", DBNull.Value)
    cmd.Parameters.AddWithValue("@Deleted", DBNull.Value)
    cmd.Parameters.AddWithValue("@SubTypeID", DBNull.Value)
    Using DotNetdatabase As New DBAccessLayer.DBAccessLayer(VBDotNetConn)
        Try
            Dim ds As DataSet
            ds = DotNetdatabase.OpenDataSetWithoutErrorMsg(cmd)
            Return (0)
        Catch ex As Exception
         AddToErrorLog(ex.Message, "Adding Note")
            Throw ex
        End Try
    End Using
End Function

public class DBAccessLayer
    private myConnection as SqlConnection
    Public Sub New(ByVal strConnectionString As String)
          myConnection = New SqlConnection(strConnectionString)
    End Sub
     Public Function OpenDataSetWithoutErrorMsg(ByVal myCommand As SqlCommand) As DataSet
            Dim MyDataSet As New DataSet
            Dim myDataAdapter As SqlDataAdapter
            Try
                Dim blnInitiallyOpen As Boolean = True

                    myConnection.Open()
                    Do Until myConnection.State = ConnectionState.Open
                            Threading.Thread.Sleep(100)
                    Loop

                    myCommand.CommandTimeout = 0
                    myCommand.Connection = myConnection
                    myDataAdapter = New SqlDataAdapter(myCommand)
                    myDataAdapter.Fill(MyDataSet)

                    myConnection.Close()

                    Return MyDataSet
            Catch e As Exception
                    If myConnection.State = ConnectionState.Open Then
                        myConnection.Close()
                    End If
                    Throw e
                   Return Nothing
               End Try
    End Function
end class*

Спасибо

Hugh Если знания могут создавать проблемы, то не по незнанию мы будем их решать.

Исаак Азимов

1 Ответ

3 голосов
/ 30 июня 2010

Хью:

Как мне решить эту проблему:

1) в вашем улове, в частности, отловить ошибку, касающуюся меньшего количества столбцов во вставке.Затем запишите текст команды и значения параметров / или выполните ручное исследование.Если вы не видите там своей проблемы, то опубликуйте результаты этой регистрации в своем вопросе.Если вы видите проблему, то выберите мой ответ :) -> Интересно, а что, если бы такой параметр, как @Body, был бы пустой строкой, а не нулем?Как бы выглядел оператор вставки?

2) Я программист БД.Этот код принадлежит хранимой процедуре.Гораздо проще отлаживать.

3) Удалось ли вам сузить вхождение до набора данных?

4) Идти с логикой Yellowfog - есть ли триггер или, что не менее важно,- какой-то другой фрагмент кода запускается по соединению - происходит в последовательности, в которой вы, возможно, генерируете ошибку, но однажды всплывет то, где когда-либо вы ее видите, она выглядит как этот код?Я знаю, что часто, когда я уверен, что фрагмент кода не может вызвать конкретное исключение, я прав, я просто смотрю на неправильный код.

5) Используйте сервер SQLПрофилировщик, чтобы увидеть, какие операторы на самом деле выполняются.Я хотел бы добавить следующие события: TSQL-SQL: StmtCompleted и SQL: StmtStarting, ошибки и предупреждения: все из них.Это будет проще всего сделать на коробке с минимально возможным трафиком.Эта страница может помочь вам начать работу.

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