2014-01-21 21 views
0

“参数?_1没有默认值”错误在Web服务中存在以下代码问题。已经寻找了解决方案,但我所见过的任何东西似乎与我在下面做的不同。当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 
+0

的[参数OleDbCommand的顺序和优先级]可能重复(http://stackoverflow.com/questions/1476770/oledbcommand-parameters-order-and-priority) – Dubas

回答

0

其实这个问题有一个错误的假设,那就是,有在代码中的错误得到一个字符串。

SQL查询的语法是正确的,参数被正确插入。但是,测试数据包含错误,因此正确格式化的查询不会返回任何结果。

谢谢大家的意见。

-1

重复的的: 传递 参数OleDbCommand parameters order and priority

的OLE DB .NET提供程序不支持命名参数当一个SQL语句或一个存储过程由一个 OleDbCommand当CommandType设置为文本。在这种情况下,必须使用 问号(?)占位符。例如:

// 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

+0

你看我的代码? – wingyip

+0

这就是我在做的 – wingyip

0

你有什么看起来与正确的 “?”作为参数添加到命令的参数占位符。您当前拥有标识为OleDbType.VarWChar的参数。这是打算吗?你在处理unicode数据吗?我怀疑不是在这种情况下。尝试更改为OleDbType.Char,这也表示处理System.String值。

你也可以确保您使用

AccountNo.ToString()

+0

其实这是对的。烦人的是,这个问题是由测试数据中的错误引起的。非常令人沮丧。无论如何感谢您的意见。 – wingyip

3

这是一个耻辱,前两名的StackOverflow目前结果在谷歌的搜索涉及

Parameter ?_ has no default value 

都有提问回来的,说有在原来的问题,瑕疵或他们的测试数据或什么(虽然回答问题的人很棒)。

(如在正常情况下所遇到)此错误的解释是由Marc Gravell here供给:

为NULL。价值参数不传递。完全一样。

您需要传递DBNull.Value来传递语义null。对于 例如:

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