C# 将int转换为保存在SQL Server数据库中的字符串

C# 将int转换为保存在SQL Server数据库中的字符串,c#,string,listview,int,dataadapter,C#,String,Listview,Int,Dataadapter,我有一个SQL Server数据库,它有一个表Event\u选项卡,表中有Int列code。我想将此code与特定的string相关联,这样我就不会在表中保存string变量 因此,我用16个输入参数编写了一个过程GetStringCode,它返回我需要的字符串,然后用表中保存的另一个参数将其填充到listview中 这是我的代码: using (SqlConnection connection = new SqlConnection(connectionstring)) using (SqlD

我有一个SQL Server数据库,它有一个表
Event\u选项卡
,表中有
Int
code
。我想将此
code
与特定的
string
相关联,这样我就不会在表中保存string变量

因此,我用16个输入参数编写了一个过程
GetStringCode
,它返回我需要的字符串,然后用表中保存的另一个参数将其填充到listview中

这是我的代码:

using (SqlConnection connection = new SqlConnection(connectionstring))
using (SqlDataAdapter adapter = new SqlDataAdapter(query, connection))
{
    DataTable table = new DataTable();
    adapter.Fill(table);

    foreach(DataRow dr in table.Rows)
    {
        ListViewItem items = new ListViewItem(dr["Machine"].ToString());                    
        items.SubItems.Add(GetStringCode((short)dr["Code"]).ToString());
        items.SubItems.Add(dr["Date_time"].ToString());
        listview.Items.Add(items);
    }
}  
如果你注意到的话,我做了一个演员来消除一个错误

无法从object转换为short

到目前为止,一切似乎都很好。但是当我尝试运行此代码时,我得到了一个错误

特定强制转换无效


问题是什么,因为我似乎找不到它…

如果SQL表为代码定义列,如下所示:

CREATE TABLE Event_Tab (
    Machine varchar(255),
    Code int,
    Date_time datetime
);
那么来自SQL的数据类型将不会转换为C#
short
Int16
,因为SQL
int
相当于C#
Int32
()


您可能会遇到取消装箱问题,而不是类型转换问题。int类型的变量将强制转换为short。但是,带框的int不能直接转换为short。装箱值类型只能直接转换为精确的装箱类型

int i = 100;
object o = i; // Boxed int.
short s1 = (short) i; // Works.
short s2 = (short) o; // Throws InvalidCastException.
short s3 = (short) (int) o; // Works.
DataRow
将字段值存储为
object
,因此值类型被装箱。这意味着,试图将一个已装箱的int型字段值直接转换为short会导致问题。两阶段强制转换(如上s3所示)可以解决此问题


发生错误时,“DataRow dr”的内容是什么?“Code”可能是空的或null。@Stringfellow,它不是空的。我检查了我的表数据,通过检查调试器中dr[“Code”]的值和实际类型,它有numberStart。您是否建议将我的代码列类型更改为SqlInt32?因为我甚至没有选择这种列类型,而且我无法使用SqlInt32在c中进行强制转换,所以它无法识别它。不,不建议使用
SqlInt32
。试图演示SQL中的类型如何与C#中的类型不匹配,从而导致无效强制转换异常。希望暗示使用调试器深入挖掘SQL返回的数据类型和数据表中的数据类型。顺便说一下,
SqlInt32
中使用System.Data.SqlTypes成功了谢谢,我会去检查装箱/拆箱,因为这是我第一次遇到它
int i = 100;
object o = i; // Boxed int.
short s1 = (short) i; // Works.
short s2 = (short) o; // Throws InvalidCastException.
short s3 = (short) (int) o; // Works.