C# 不作为条件工作的类型

C# 不作为条件工作的类型,c#,sqlite,object,types,typeof,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

我目前有一种方法可以查看输入的对象类型,并基于它创建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() + "'";
}
但这似乎不起作用,所有内容都以.toString()为基础返回,布尔值返回为True/False,但日志选择的类型为system.Boolean。像这样:

我正在使用SQLite,不知道是否应该麻烦使用适当的数据类型,因为限制不存在,甚至事实上,在DB上布尔列是INT(1),但仍然存储True/False。我应该什么都用文本吗

我目前有一个方法可以查看输入是什么类型的对象,并基于它创建SQL输入

不要这样做。改用参数化SQL。您不应该试图格式化您的值以便在SQL中使用。这几乎总是SQL注入攻击的一个途径

现在,关于问题本身。。。您正在检查
o
本身是否为
typeof(bool)
——而我怀疑您想检查
o.GetType()
是否为
typeof(bool)

最好使用
is
操作符:

if (o is string)
{
    return "'" + o + "'";
}
if (o is bool)
{
    bool value = (bool) o;
    return value ? "1" : "0";
}
// Are you sure you want this? I would throw an exception if you
// don't know what to do with the value...
return "'" + o + "'";
我目前有一个方法可以查看输入是什么类型的对象,并基于它创建SQL输入

不要这样做。改用参数化SQL。您不应该试图格式化您的值以便在SQL中使用。这几乎总是SQL注入攻击的一个途径

现在,关于问题本身。。。您正在检查
o
本身是否为
typeof(bool)
——而我怀疑您想检查
o.GetType()
是否为
typeof(bool)

最好使用
is
操作符:

if (o is string)
{
    return "'" + o + "'";
}
if (o is bool)
{
    bool value = (bool) o;
    return value ? "1" : "0";
}
// Are you sure you want this? I would throw an exception if you
// don't know what to do with the value...
return "'" + o + "'";

如果在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");

对于整型字段。尽管使用相同的数据类型并且不依赖此转换功能始终是一个好主意。

如果在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");

对于整型字段。尽管在我看来,使用相同的数据类型而不依赖此转换功能始终是一个好主意。

我已经有一段时间没有使用C了,但是
o==typeof
看起来不太合适。像
o.type==typeof
这样的东西更有意义。查看您的问题是否得到满意的回答,请选择一个答案结束此问题。谢谢我已经有一段时间没有做C了,但是
o==typeof
看起来不对劲。像
o.type==typeof
这样的东西更有意义。查看您的问题是否得到满意的回答,请选择一个答案结束此问题。谢谢@TristanCunningham:非常非常不清楚您试图做什么-但正如我所说的,您不应该尝试格式化SQL参数。我建议您考虑创建一个新的问题,它给出了更多关于如何使用这个问题的详细信息,因此我们可以帮助您正确使用SQL参数。@ TristCunun宁罕:您所要做的非常,非常不清楚。但是,正如我所说,您不应该试图格式化SQL参数。我建议您考虑创建一个新的问题,它给出了更多关于如何使用这个问题的细节,因此我们可以帮助您正确使用SQL参数。