2014-01-28 45 views
0

虽然有问题的数据是一个字符串,并且所有的代码都是这样引用的,但我得到了“InvalidCastException”。如何将文本分配给字符串是无效投射?

这里的型号:

public class Vendor 
{ 
    [Required] 
    public string VendorId { get; set; } 
    [Required] 
    public string CompanyName { get; set; } 
} 

这里的查询:

using (var cmd = conn.CreateCommand()) 
{ 
    cmd.CommandText = "SELECT contact_id as VendorID, company_name FROM t_contacts where type = 'V'"; 
    cmd.CommandType = CommandType.Text; 
    conn.Open(); 
    using (OleDbDataReader oleDbD8aReader = cmd.ExecuteReader()) 
    { 
     while (oleDbD8aReader != null && oleDbD8aReader.Read()) 
     { 
      var vendorId = oleDbD8aReader.GetString(0); 
      var companyName = oleDbD8aReader.GetString(1); 
      Add(new Vendor { VendorId = vendorId, CompanyName = companyName }); 
     } 
    } 
} 

中MS Access表被查询两列是字符串(文本字段大小10 CONTACT_ID,文本字段大小50 COMPANY_NAME )。 “类型”是文本字段大小1.

该错误消息指示它认为COMPANY_NAME是int:

System.InvalidCastException是由用户代码 的HResult = -2147467262 消息=指定转换无效未处理。 源= System.Data 堆栈跟踪: 在System.Data.OleDb.ColumnBinding.ValueString() 在System.Data.OleDb.OleDbDataReader.GetString(的Int32有序) 在HandheldServer.Models.VendorRepository..ctor()中C:\ HandheldServer \ HandheldServer \型号\ VendorRepository.cs:行35

第35行是:

string companyName = oleDbD8aReader.GetString(1); 

怎么能分配COMPANY_NAME的内容(文本50)为一个字符串导致无效的转换?

回答

3

你看过什么数据库驱动程序返回?

我敢打赌,它返回一个SQL null,这显然不是C#null也不是一个字符串。如果您查看堆栈跟踪,则会从GetString()方法中抛出异常。

在调用GetString()之前,您必须验证该列是所需的类型(字符串)并且该列是非空的。 OleDbDataReader.IsDBNull()方法指示无效。

2

这不是将字符串对象分配给字符串变量,这是问题,因为这会在编译时拾取。问题在于GetString方法必须在内部将存储在数据读取器中的Object引用转换为String类型,并且在运行时失败,因此数据读取器不在该列中包含String。如果列数据类型是文本,那么问题的唯一可能原因是该列包含NULL。数据读取器有它自己的IsDbNull方法来测试。

0

有两种方法来解决它;您可以选择的是kludgier:

方式:

cmd.CommandText = "SELECT contact_id as VendorID, company_name FROM t_contacts where type = 'V'"; 

while (oleDbD8aReader != null && oleDbD8aReader.Read()) 
{ 
    if (!oleDbD8aReader.IsDBNull(0)) 
    { 
     vendorId = oleDbD8aReader.GetString(0); 
    } 
    else 
    { 
     vendorId = "blank"; 
    } 
    if (!oleDbD8aReader.IsDBNull(1)) 
    { 
     companyName = oleDbD8aReader.GetString(1); 
    } 
    else 
    { 
     companyName = "blank"; 
    } 
    Add(new Vendor { VendorId = vendorId, CompanyName = companyName }); 
} 

路蜂:

cmd.CommandText = "SELECT IIF(ISNULL(contact_id),'[blank]', contact_id), IIF(ISNULL(company_name),'[blank]', company_name) FROM t_contacts where type = 'V'"; 

while (oleDbD8aReader != null && oleDbD8aReader.Read()) 
{ 
    vendorId = oleDbD8aReader.GetString(0); 
    companyName = oleDbD8aReader.GetString(1); 
    Add(new Vendor { VendorId = vendorId, CompanyName = companyName }); 
}