2014-02-16 91 views
0

我已经创建了一个代码来从一个数据库中获取数据并将其放入第二个数据库中,目前我遇到的问题是当数据库中的字段为空它返回一个错误 “转换型‘的DBNull’到类型‘串’无效”类型'字符串'的转换类型'DBNULL'无效

我使用的代码是:

Dim ITN As String = ResultSet.Item("ItemNumber") 
Dim QN As String = ResultSet.Item("QuoteNumber") 
Dim ITD As String = ResultSet.Item("ItemDescription") 
Dim DET As String = ResultSet.Item("Details") 
Dim PR As String = ResultSet.Item("Price") 

希望有人能与这一次助攻!

回答

0

您可以使用三元语句并在将其转换为字符串之前检查Item是否为null。

此外,在C#中,你可以做这样的事情:

字符串值= ResultSet.Item( “价格”)的字符串;

as将自动将无效的引用类型转换为null。对于VB.NET:

VB.Net equivalent of C# "As"

0

我累了检查DBNull的,所以我写了一个函数。根据您使用的数据库的类型,这取决于实际情况,但为了提高效率,您可能需要使用StringBuilder类而不是字符串连接。

如果使用参数化查询看到这个link一个非常基本的介绍了如何使用参数化查询与访问,您将能够直接插入特殊的DBNull值:

Dim myConnection As New OleDbConnection(DBConnection) 
Dim Cmd As OleDbCommand = New OleDbCommand() 
Cmd.CommandText = "INSERT INTO dbTable (ItemNumber, QuoteNumber, ItemDescription, Details, Price) VALUES (@ITN, @QN, @ITD, @DET, @PR)" 
Cmd.Parameters.Add(New OleDbParameter("@ITN", OleDbType.VarChar)).Value = CheckDBNull(ITN) 
Cmd.Parameters.Add(New OleDbParameter("@QN", OleDbType.VarChar)).Value = CheckDBNull(QN) 
Cmd.Parameters.Add(New OleDbParameter("@ITD", OleDbType.VarChar)).Value = CheckDBNull(ITD) 
Cmd.Parameters.Add(New OleDbParameter("@DET", OleDbType.VarChar)).Value = CheckDBNull(DET) 
Cmd.Parameters.Add(New OleDbParameter("@PR", OleDbType.VarChar)).Value = CheckDBNull(PR) 
DBConnection.Open() 
Cmd.ExecuteNonQuery() 

这也有利于避免令人讨厌的SQL注入。就像我提到的,取决于数据库使用的是你可能需要使用SqlParameter & SqlDbTypeOleDbParameter & OleDbType但CheckDBNull功能可以是简单的,如下:

Private Function CheckDBNull(ByVal s As String) As Object 
    If Not s Is Nothing And s.Length > 0 Then 
     Return s 
    Else 
     Return System.DBNull.Value 
    End If 
End Function 

我希望这有助于。请注意,这些参数中的一些仅用作示例(myConnection,Cmd,dbTable),因为您没有提供数据库信息:

相关问题