2014-11-03 3 views
0

Этот запрос INSERT отлично работает в VS20012, SQL Server 2008 R2. Но когда я пытаюсь выполнить его из кода VB позади, я получаю ошибку DBnull Conversion в строке, пытающейся присвоить значение переменной после выполнения.Назначение идентификатора переменной с параметром OUTPUT

Вставка также не удалась, но также не вызывает ошибку Try Catch. Даже после закрытия соединения. Очень странное поведение.

sqSql = "INSERT INTO tblLogging (vein, num, descripBaseFileName, " & _ 
     " csvBaseFileName, baseActive, diagActive) " & _ 
     " OUTPUT INSERTED.keyID" & _ 
     " VALUES (@vein, @num, @cnfFil, @csvFil, 'True', 'False')" 

command3.Parameters.AddWithValue("@vein", vein1) 
command3.Parameters.AddWithValue("@num", veinNum) 
command3.Parameters.AddWithValue("@cnfFil", cnfFil) 
command3.Parameters.AddWithValue("@csvFil", csvFil) 

command3.Parameters.Add("@keyID", SqlDbType.Int) 
command3.Parameters("@keyID").Direction = ParameterDirection.Output 

Try 
    command3.CommandText = sqSql 

    oCnn.Open() 
    command3.ExecuteScalar() 
    oCnn.Close() 

ОШИБКИ здесь:

**Dim retkeyID As Integer = command3.Parameters("@keyID").Value** 

Catch ex As Exception 
    Throw ex 

End Try 

Любые идеи о том, что я делаю неправильно было бы весьма признателен.

+0

Вы должны проверить [Можно ли прекратить использование AddWithValue() уже?] (http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/) и прекратите использовать '.AddWithValue()' - это может привести к неожиданным и неожиданным результаты ... –

ответ

1

В вашем контексте (единственная вставка с единственным возвращаемым значением) вам не нужен выходной параметр, чтобы вернуть значение предложения OUTPUT.
Вы можете просто преобразовать возвращаемое значение из ExecuteScalar

Dim result = Convert.ToInt32(command3.ExecuteScalar()) 

Если вы действительно хотите использовать параметр @keyID вывода, то вам необходимо установить его перед выходом из запроса.

sqSql = "INSERT INTO tblLogging (vein, num, descripBaseFileName, " & _ 
     " csvBaseFileName, baseActive, diagActive) " & _ 
     " VALUES (@vein,@num,@cnfFil,@csvFil,'True', 'False'); " & _ 
     "SELECT @KeyID = SCOPE_IDENTITY(); " 

(Конечно, это предполагает, что KeyID является столбец IDENTITY и не рассчитывается какой-то триггер в базе данных)

+0

Я знаю, что это должно работать, но я все время возвращаюсь обратно. Протестировало соединение, сбросив Gridview в форме и используя смарт-тег для настройки запроса, позволяет редактировать, обновлять и удалять, но этот запрос не будет вставлять запись в это время. – htm11h

+0

Вам нужно отлаживать. Получаете ли вы что-то из ExecuteScalar или получаете нуль? В любом случае я попытаюсь решить шаг за шагом. Сначала я бы просто использовал вставку без просмотра OUTPUT, если запись была добавлена ​​или нет. Затем прочитайте код, чтобы вернуть OUTPUT или SELECT IDENTITY. – Steve

+0

В качестве боковой ноты baseActive и diagActive являются столбцами бит? – Steve