我正在尝试构建基于用户选择的动态查询,例如我的数据库结构如下所示:
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;
}
答案 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.String
和System.Int32
),则可以使用Type.GetType(typeName)
。例如:
var type = Type.GetType("System.Int32");
如果您没有使用完整类型名称并且使用友好类型名称(如string
和int
),则可以创建类型字典并从字典中获取其类型,例如:
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
创建的,不需要任何类型转换。但我强烈建议停止使用字符串连接创建查询。