当我尝试从我的SQLite数据库中获取一个Integer时,我只能通过将其作为字符串读取来运行它,然后在其上运行int.Parse
。
这是对的吗,我读到了与ExeculeScalar
有关的事情可能会给予null吗?
这是我当前的代码SendSQLExecScalar()
发送命令字符串等并返回一个对象
public object SendSQLExecScalar(string C)
{
OpenConnection();
SQLiteCommand SQLCommand = new SQLiteCommand(C, DbConnection);
try
{
object Output = SQLCommand.ExecuteScalar();
CloseConnection();
return Output;
}
catch (Exception X)
{
MessageBox.Show(X.Message);
return null;
}
}
和
int ID = int.Parse(SendSQLExecScalar(C).ToString());
编辑:
指定的演员表无效。
public static int GetImageID(string Path)
{
string C = "SELECT ID FROM Images WHERE Path LIKE '" + Path + "' LIMIT 1";
return ConvertFromDBVal<int>(SendSQLExecScalar(C));
}
public static T ConvertFromDBVal<T>(object obj)
{
if (obj == null || obj == DBNull.Value)
{
return default(T);
}
else
{
return (T)obj; //breaks here saying this cast is invalid
}
}
答案 0 :(得分:0)
我读了一些关于这可能与executeleScalar有关的事情 给回null?
是的,如果您的sql查询没有返回数据,ExecuteScalar
将返回null
引用。
如果你100%确定第一行第一列的返回值已经 int
,你可以像它一样投射它;
int ID = (int)SendSQLExecScalar(C);
为防止此方法出现空案例,我几乎总是使用rein's generic method;
public static T ConvertFromDBVal<T>(object obj)
{
if (obj == null || obj == DBNull.Value)
{
return default(T); // returns the default value for the type
}
else
{
return (T)obj;
}
}
答案 1 :(得分:0)
使用TryParse而不是Parse,这允许您测试某些内容是否可解析。
如果你使用带有无效int的int.Parse(),你会在TryParse中得到一个异常,它会返回一个布尔值,让你知道解析是否成功。
简而言之,如果您确定该值有效,请使用Parse;否则使用TryParse。
int number = int.Parse(someString);
int number;
int.TryParse(someString, out number);
答案 2 :(得分:0)
(int)(long)SendSQLExecScalar(C);
用这个解决,看起来像SQLite整数将返回一个长对象,我需要在将它转换为int之前解压缩。