将 int 转换为保存在 SQL 服务器数据库中的字符串

Convert an int to a string saved in a SQL Server database

我有一个 SQL 服务器数据库,带有 table Event_TabIntCode。我想将此 Code 与特定的 string 相关联,这样我就不会在我的 table 中保存字符串变量。

所以,我写了一个程序 GetStringCode 带有 In16 输入参数,它 returns 我需要的字符串,然后我将它填入列表视图,另一个参数保存在我的 table

这是我的代码:

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);
    }
}  

如果你注意到了,我做了一个转换来消除错误

Cannot convert from object to short

到目前为止一切似乎都还不错。但是当尝试 运行 这段代码时,我得到一个错误

The specific cast is invalid

有什么问题,我好像找不到...

如果 SQL table 正在为 代码 定义列,如下所示:

CREATE TABLE Event_Tab (
    Machine varchar(255),
    Code int,
    Date_time datetime
);

那么来自 SQL 的数据类型将不会转换为 C# 的 shortInt16 因为 SQL int 等同于 C# Int32 (Data Type Mapping)

static void Main(string[] args)
{
    DataTable table = new DataTable();
    table.Columns.Add("Machine", typeof(string));
    table.Columns.Add("Code", typeof(SqlInt32));
    table.Columns.Add("Date_time", typeof(DateTime));

    DataRow dr = table.NewRow();
    dr.ItemArray = new object[] { "machineA", 1122, DateTime.Now };

    // Works
    Int32 i32 = ((SqlInt32)dr["Code"]).Value;

    // Throws 'Specified cast is not valid.'
    Int16 i16 = (short)dr["Code"];
}

您可能 运行 遇到了拆箱问题,而不是类型转换问题。 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 中)可能会解决问题。

What is the difference between boxing/unboxing and type casting?