将表格文本框值动态输入到表格列

时间:2016-01-31 21:36:50

标签: c# winforms casting

我正在尝试构建基于用户选择的动态查询,例如我的数据库结构如下所示:

columnname  datatype
productid     int
productname   varchar(100)
updatedate    datetime
lastsaledate  datetime

我有一个组合框,可以动态加载表名。如果选择了特定的表,则将生成所有列名称到列表框,然后用户将根据其要求选择列并将数据导出到excel。有时,他可能会尝试根据选择列并输入列的值来检索数据。

我的问题是因为我的sql查询是根据用户选择动态构建的,有时他可能会选择productid来检索所有产品然后数据类型是int然后我的sql查询应该构建像

select * from products where productid= @pid

由于@pid值是从文本框提供的,我将得到错误数据类型不匹配或其他东西。如何动态转换为所选列的数据类型。

var type = Type.GetType(label2.Text);
            queryCmd += " WHERE " + comboBox2.SelectedItem.ToString() + "=" + Convert.ChangeType(textBox1.Text, type);

 public static Type GetType(string typeName)
    {
        var type = Type.GetType(typeName);
        if (type != null) return type;
        foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
        {
            type = a.GetType(typeName);
            if (type != null)
                return type;
        }
        return null;
    }

2 个答案:

答案 0 :(得分:0)

如果你想将一个字符串强制转换为int,你可以像这样强制转换它:

string value = "10";
int result = Convert.ToInt32(value);//value is what you want to convert

如果值无法转换,您将获得需要处理的异常。或者您可以像这样使用TryParse:

bool result = Int32.TryParse(value, out number);
if (result)
{
    Console.WriteLine("Converted '{0}' to {1}.", value, number);
}
else
}
//            if (value == null) value = ""; 
    Console.WriteLine("Attempted conversion of '{0}' failed.", 
                           value == null ? "<null>" : value);
}

这些方法适用于所有数据类型。

答案 1 :(得分:0)

找到类型

要将字符串转换为具有类型名称的目标类型,如果您使用完整类型名称(如System.StringSystem.Int32),则可以使用Type.GetType(typeName)。例如:

var type  = Type.GetType("System.Int32");

如果您没有使用完整类型名称并且使用友好类型名称(如stringint),则可以创建类型字典并从字典中获取其类型,例如:

var types = new Dictionary<string, Type>();
types.Add("bool", typeof(bool));
types.Add("int", typeof(int));
types.Add("string", typeof(string));
//and so on for byte, short, long, float, double, decimal, ...

然后:

var type = types["int"];

将字符串值转换为目标类型

您可以使用Convert.ChangeType(value, conversionType)方法将值更改为转换类型。当值无法转换为目标类型时,您还应该处理可能的FormatException。例如:

var value = Convert.ChangeType("1", type);

将参数添加到命令

您可以使用AddWithValue (parameterName, value)方法向命令的Parameters集合添加参数,并传递参数名称和从字符串转换的值。例如:

command.Parameters.AddWithValue("@Id", value);

注意

如果要继续使用字符串连接创建查询,例如问题的最后一个代码部分(遭受SQL注入漏洞),则不需要任何类型转换,因为您将仅使用字符串值{,例如"Id=1"是使用"Id=" + textBox1.Text创建的,不需要任何类型转换。但我强烈建议停止使用字符串连接创建查询。