我使用的是一个简单的数据库。它包含两个用户条目,一个是UserID 1和IsAdmin 0的用户,另一个是UserID 3041234567和IsAdmin为1的用户。数据库中唯一的字段是字符串UserID和位IsAdmin。我使用以下代码从数据库中读取:
SqlConnection conn = new SqlConnection(Properties.Settings.Default.Conn);
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE UserID = " + t.Text.ToString(), conn);
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
user.UserID = reader["UserID"].ToString();
user.IsAdmin = Convert.ToBoolean(reader["IsAdmin"]);
}
}
conn.Close();如果在UserID中输入数字3041234567,一切都工作得很好,但是如果输入数字1,就会得到一个异常,即“nvarchar值'3041234567‘的转换溢出了一个int列。”
如果我设置了一个断点,并观察了while(reader.read())循环,则循环会遍历精细,并设置user.UserID =1和user.IsAdmin = false。当循环开始第二次迭代时,会引发异常。我想我有几个问题:
"SELECT * FROM Users WHERE UserID = 1"返回ID 3041234567?发布于 2016-02-16 14:04:32
嗯,既然
3041234567 > int.MaxValue ( == 2147483647)您有一个溢出;但是,如果您想要某种整数值,请尝试long ( 64位长):
long value = Convert.ToInt64(reader["UserID"]);就像这样:
// Wrap IDisposable into using
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.Conn)) {
conn.Open();
// Make sql
// 1. Readable
// 2. Parametrized
// 3. Avoid * in select
String sql =
@"select UserID,
IsAdmin
from Users
where UserID = @prm_UserId";
// Wrap IDisposable into using
using (SqlCommand cmd = new SqlCommand(sql, conn)) {
// Explicit data type will be better here (Add Parameter with type)
// but I don't know it
cmd.Parameters.AddWidthValue("prm_UserId", t.Text);
// Wrap IDisposable into using
using (SqlDataReader reader = cmd.ExecuteReader()) {
// You don't want to iterate the whole cursor, but the first record
if (reader.Read()) {
//TODO: Make UserID being "long"
user.UserID = Convert.ToInt64(reader["UserID"]);
user.IsAdmin = Convert.ToBoolean(reader["IsAdmin"]);
}
}
}
} https://stackoverflow.com/questions/35434343
复制相似问题