将 int 转换为保存在 SQL 服务器数据库中的字符串
Convert an int to a string saved in a SQL Server database
我有一个 SQL 服务器数据库,带有 table Event_Tab
和 Int
列 Code
。我想将此 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# 的 short
或 Int16
因为 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?
我有一个 SQL 服务器数据库,带有 table Event_Tab
和 Int
列 Code
。我想将此 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# 的 short
或 Int16
因为 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?