Typeof不作为条件

时间:2016-08-21 06:53:01

标签: c# sqlite object types typeof

我目前有一种方法可以查看输入的对象类型,并根据它创建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。像这样:

enter image description here

我正在使用SQLite并想知道我是否应该使用正确的数据类型,因为限制不存在甚至布尔列在数据库上的INT(1)但仍然存储True / False 。我应该只使用TEXT。

2 个答案:

答案 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的转换功能总是一个好主意。