我目前有一种方法可以查看输入的对象类型,并根据它创建SQL输入,如下所示:
private static string PropertyToDBString(object o)
{
Debug.Log(o.GetType());
if (o == typeof(System.String) || o == typeof(string))
return "'" + o.ToString() + "'";
else if (o == typeof(System.Boolean) || o == typeof(bool))
return ((System.Boolean)o) ? "1" : "0";
return "'" + o.ToString() + "'";
}
但是这似乎不起作用,Everything以.toString()为基础返回,Boolean返回为True / False,但是日志正在将类型作为system.boolean。像这样:
我正在使用SQLite并想知道我是否应该使用正确的数据类型,因为限制不存在甚至布尔列在数据库上的INT(1)但仍然存储True / False 。我应该只使用TEXT。
答案 0 :(得分:2)
我目前有一种方法可以查看输入的对象类型,并根据它创建SQL输入
不要这样做。请改用参数化的SQL。您应该不尝试格式化您在SQL中使用的值。这几乎总是将成为SQL注入攻击的途径。
现在,关于问题本身......你要检查o
本身是否typeof(bool)
- 而我怀疑你想检查o.GetType()
是否{{1} }}
更好的是,使用typeof(bool)
运算符:
is
答案 1 :(得分:2)
如果在SQL中使用参数,则无需担心数据类型或单引号。
对于插入,而不是:
com.CommandText = "Insert into MyTable (ID,Name,Birthday,Age) values (12,'Bob','01/01/1980',24)";
你这样做:
com.CommandText = "Insert into MyTable (ID,Name,Birthday,Age) values (@ID,@Name,@BD,@Age)";
int ID = 12;
string Name = "Bob";
DateTime Birthday = new DateTime(1980, 1, 1, 0, 0, 0);
Int Age = 24;
com.Parameters.AddWithValue("@ID", ID);
com.Parameters.AddWithValue("@Name", Name);
com.Parameters.AddWthValue("@BD", Birthday);
com.Parameters.AddWithValue("@Age", Age);
对于布尔输入,您可以执行以下操作:
bool isTrue = true;
com.Parameters.AddWithValue("@isHappyCustomer",isTrue ? 1 : 0);
使用参数时,您不需要使用与数据库中相同的数据类型 - 只要值本身符合数据库字段的要求即可。所以你可以把一个字符串发送到像
这样的日期com.Parameters.AddWithValue("@date","1/1/2016");
表示日期字段,或
com.Parameters.AddWithValue("@age","24");
表示int字段。虽然使用相同的数据类型并且不依赖于IMO的转换功能总是一个好主意。