Параметр ?_1 не имеет значения по умолчанию при ошибке ExecuteReader

Возникла проблема с приведенным ниже кодом в веб-службе. Искал решение, но ничто из того, что я видел, не отличается от того, что я делаю ниже.

Примечание. Строковая переменная AccountNo передается в функцию, которая включает приведенный ниже код.

Ошибка возникает на последней строке кода — ExecuteReader.

    Dim sConnString As String
    Dim rdr As OleDbDataReader
    Dim orderPaid As Decimal
    Dim fbeused As Decimal

    sConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='c:\orders.mdb'"

    Dim conn As New OleDbConnection(sConnString)

    Dim sb As New StringBuilder
    sb.Append("SELECT DISTINCTROW OrderHeaders.Accountno, Sum(([paidqty]*[unitprice])*[orderheaders].[entpercent]/100) AS orderpaid, Sum([freeqty]*[unitprice]) AS fbeused")
    sb.Append(" FROM OrderHeaders INNER JOIN OrderDetails ON OrderHeaders.[OrderNo] = OrderDetails.[OrderNo]")
    sb.Append(" GROUP BY OrderHeaders.Accountno HAVING OrderHeaders.Accountno=?")
    Dim sqlString As String = sb.ToString

    Dim cmd As New OleDbCommand(sqlString, conn)
    cmd.CommandType = CommandType.Text
    'cmd.Parameters.AddWithValue("AccNo", AccountNo)
    cmd.Parameters.Add("AccNo", OleDbType.VarWChar).Value = AccountNo
    conn.Open()

    rdr = cmd.ExecuteReader()

Я получаю ошибку (как указано выше)

Parameter ?_1 has no default value

person wingyip    schedule 21.01.2014    source источник
comment
возможный дубликат порядка и приоритета параметров OleDbCommand   -  person Dubas    schedule 21.01.2014


Ответы (4)


Обидно, что два лучших результата StackOverflow в настоящее время выдаются в Google по запросам, включающим

Parameter ?_ has no default value

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

Объяснение этой ошибки (которое встречается в обычных ситуациях) предоставлено Марком Гравеллом здесь:

Параметры с нулевым значением .Value не передаются. Вообще.

Вместо этого вам нужно передать DBNull.Value, чтобы передать семантический нуль. Например:

com.Parameters.Add("@p7", OleDbType.Char, 255).Value =
         ((object)values7[0]) ?? DBNull.Value; (etc)
person hawbsl    schedule 16.01.2015

То, что у вас есть, выглядит правильно с "?" в качестве заполнителя для параметров, добавленных в команду. В настоящее время у вас есть параметр, идентифицированный как OleDbType.VarWChar. Это предназначено? Вы имеете дело с данными юникода? Подозреваю, что не в этом случае. Попробуйте перейти на OleDbType.Char, который также представлен для обработки значений System.String.

Вы также можете убедиться, что получаете строку, используя

AccountNo.ToString()

person DRapp    schedule 21.01.2014
comment
На самом деле это было правильно. Досадно, что проблема была вызвана ошибками в тестовых данных. Очень расстраивает. Спасибо за вклад в любом случае. - person wingyip; 27.01.2014

На самом деле в вопросе было неправильное предположение, и это заключалось в том, что в коде была ошибка.

Синтаксис SQL-запроса был правильным, и параметр вставлялся правильно. Однако тестовые данные содержали ошибки, поэтому правильно отформатированный запрос не возвращал никаких результатов.

Спасибо всем за участие.

person wingyip    schedule 26.01.2014

Дублировано: порядок и приоритет параметров OleDbCommand

Поставщик OLE DB .NET не поддерживает именованные параметры для передачи параметров в инструкцию SQL или хранимую процедуру, вызываемую OleDbCommand, когда для параметра CommandType задано значение Text. В этом случае необходимо использовать знак вопроса (?). Например:

// Create SQL with ? for each parameter
String sql = "SELECT Address FROM Adresses WHERE Country = ? AND City = ?";
OleDbCommand command = new OleDbCommand(sql , connection);

// Add to command each paramater VALUE by position. 
// One parameter value for ?
command.Parameters.Add("My City") ;
command.Parameters.Add("My Country") ;

http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters.aspx

person Dubas    schedule 21.01.2014
comment
Это то, что я делаю - person wingyip; 21.01.2014