2012-02-23 2 views
2

Я видел, что некоторые другие столкнулись с подобной проблемой. Я прочитал и проверил вопрос под названием Procedure expects parameter which was not supplied. Я думал, что это будет решить мою проблему, но я был неправ :(Я сделал проверить шаги, которые советовали там не повезло Вот мой код:.Процедура ожидает параметр, хотя параметр предоставлен

oOleDbCommand.CommandText = "usp_PettyCash_AddBillInfo"; 
oOleDbCommand.Parameters.Add("@BillID", OleDbType.BigInt).Value = nBillID; 
oOleDbCommand.Parameters.Add("@SerialNo", OleDbType.VarChar).Value = sSerialNo; 
oOleDbCommand.Parameters.Add("@UniqueID", OleDbType.VarChar).Value = oInputBill[0].UniqueID.ToString(); 
oOleDbCommand.Parameters.Add("@BilledWeekDate", OleDbType.Date).Value = oInputBill[0].BilledWeekDate; 
oOleDbCommand.Parameters.Add("@BilledWeekNo", OleDbType.VarChar).Value = oInputBill[0].BilledWeekNo.ToString(); 
oOleDbCommand.Parameters.Add("@SettledWeekDate", OleDbType.Date).Value = oInputBill[0].SettledWeekDate; 
oOleDbCommand.Parameters.Add("@SettledWeekNo", OleDbType.VarChar).Value = oInputBill[0].SettledWeekNo; 
oOleDbCommand.Parameters.Add("@BillStatus", OleDbType.VarChar).Value = oInputBill[0].BillStatus.ToString(); 
oOleDbCommand.Parameters.Add("@UpdatedBy", OleDbType.VarChar).Value = oInputBill[0].UpdatedBy; 
oOleDbCommand.Parameters.Add("@UpdateDate", OleDbType.Date).Value = oInputBill[0].UpdateDate; 

хранимая процедура:

CREATE PROCEDURE usp_PettyCash_AddBillInfo 
(
    @BillID bigint, 
    @SerialNo varchar(50), 
    @UniqueID varchar(50), 
    @BilledWeekDate datetime, 
    @BilledWeekNo varchar(50), 
    @SettledWeekDate datetime, 
    @SettledWeekNo varchar(50), 
    @BillStatus varchar(50), 
    @UpdatedBy varchar(50), 
    @UpdateDate datetime 
) 
AS 

BEGIN 
    INSERT INTO t_BillInfo (BillID, SerialNo, UniqueID, BilledWeekDate, BilledWeekNo, SettledWeekDate, SettledWeekNo, BillStatus, UpdatedBy, UpdateDate) 
    VALUES (@BillID, @SerialNo, @UniqueID, @BilledWeekDate, @BilledWeekNo, @SettledWeekDate, @SettledWeekNo, @BillStatus, @UpdatedBy, @UpdateDate) 
END 

GO 

В то время как отладки, я нашел значение nBillID = 1.0 и sSerialNo='B201200001' Но при попытке выполнить команду ExecuteNonQuery, это дает исключение:.

«Процедура„usp_PettyCash_AddBillInfo“ожидает пар ameter '@BillID', , который не был поставлен. "

Не удается найти обходные пути. Пожалуйста помоги. Извините за повторное задание вопроса.

В качестве обходного пути, я использовал это:

oOleDbCommand.CommandText = "INSERT INTO t_BillInfo (BillID, SerialNo, UniqueID, BilledWeekDate, BilledWeekNo, SettledWeekDate, SettledWeekNo, BillStatus, UpdatedBy, UpdateDate)"+ 
" VALUES (" + nBillID + ", '" + sSerialNo + "', '" + oInputBill[0].UniqueID.ToString() + "','" + oInputBill[0].BilledWeekDate.ToShortDateString() + "', '" + oInputBill[0].BilledWeekNo + "', '" + oInputBill[0].SettledWeekDate.ToShortDateString() + "', '" + oInputBill[0].SettledWeekNo + "', '" + oInputBill[0].BillStatus.ToString() + "', '" + oInputBill[0].UpdatedBy + "', '" + oInputBill[0].UpdateDate.ToShortDateString() + "')"; 

Хотя я не люблю этот тип кодирования, но это работает.

+0

Ну одна вещь, которая прыгает в глаза: вы определяете параметры как тип 'OleDbType.VarChar' - но вы не определяет каких-либо ** длина ** Это означает, что эти параметры будут be ** 1 символ long ** - возможно ** не **, что вы хотели ..... вам нужно указать ** желаемую длину ** следующим образом: 'oOleDbCommand.Parameters.Add (" @ SerialNo ", OleDbType .VarChar, 50) .Value = ..... ' –

+0

Итак, я предполагаю, что вы уже пытались добавить' oOleDbCommand.CommandType = CommandType.StoredProcedure; ', правильно? –

+0

@ Энрико, да. @ marc_s, я тоже это пробовал, но никаких изменений :( –

ответ

3

Попробуйте добавить:

oOleDbCommand.CommandType = CommandType.StoredProcedure; 

Я считаю, что без этого, значения параметров не должны быть добавлены в линию (например, инструкции встроенного SQL). Например:

oOleDbCommand.CommandText = "usp_PettyCash_AddBillInfo @BillID, @SerialNo..."; 

Так что ваши добавления ваших параметров в команду, но они не находятся в CommandText, поэтому они не применяются в любом месте.

Для вызова хранимой процедуры, установите CommandType объекта Command к StoredProcedure. Когда для параметра CommandType установлено значение StoredProcedure, , вы можете использовать коллекцию параметров для определения параметров, как в следующем примере: .

http://msdn.microsoft.com/en-us/library/yy6y35y8(v=vs.71).aspx

+0

Вы не верите, я перезапустил свой компьютер, надеясь на какую-то детскую удачу, и после этого все работает :) Я предполагаю, что может быть какой-то случай с кешированием SQL-сервера (я понятия не имею об этом, я просто думаю) –

Смежные вопросы