如何创建MySqlCommand对象而不知道参数的数量?

时间:2016-01-11 16:56:34

标签: vb.net

我正在尝试创建MySQLCommand对象以对数据库表执行查询。现在我的问题是:

所有记录都存储在此DataRow列表中:Records,此列表包含不同表的记录字段。通常在表格中添加结果我定义一个MySqlCommand对象,稍后使用参数化查询传递参数,但是,在这种情况下我不知道参数的数量,我只有一个列表有很多里面的记录。现在存储此记录的表的名称包含在列表的第一个索引中,因此当我迭代列表时,只需跳过第一个索引并获取所有值。有人可以告诉我这是怎么做到的?

示例:

Dim query = "INSERT INTO table (name, description) VALUES (@namep, @descriptionp)"
MyCommand = New MySqlCommand(query, my connection here)
MyCommand.Parameters.AddWithValue("@namep", "some value")+
MyCommand.Parameters.AddWithValue("@descriptionp", "another value")

这是我通常做的MySqlCommand,现在想象在我的列表中有很多记录,如namedescription,还有其他查询的参数。如何创建类似的结构来添加此参数?

1 个答案:

答案 0 :(得分:2)

(我的VB非常生疏,请耐心等待......)

据推测,你有几个价值观。特别是表名和表示列名和列值的键/值对的集合。使用这些,您可以动态地为查询构建字符串。

从查询的基本结构开始。像这样:

Dim query As New StringBuilder()
query.Append("INSERT INTO ")
' TODO: append table name
query.Append(" (")
' TODO: append column names (loop)
query.Append(") VALUES (")
' TODO: append parameter names (loop)
query.Append(")")
Dim MyCommand As New MySqlCommand(query.ToString(), someConnection)
' TODO: append actual parameters (loop)

让我们一次审阅每个TODO个组件......

1。表名是容易的部分,因为不涉及循环。假设它在一个变量中:

query.Append(someTableName)

2。您可以调整各种循环的性能,但为了简单起见,现在让我们循环遍历键/值对三次。 (我们实际上使用内部有循环的内置方法,但重点仍然存在。)对于列名,让我们假设你有一个字符串数组:

query.Append(string.Join(",", someColumnNamesArray))

(注意:使用string.Join()而不是手动循环的原因是为了避免为是否在第一个/最后一个条目中包含","分隔符而做一些可能很难看的逻辑。)< / p>

3。对于参数名称,只需使用数字。我不知道参数是否允许以数字开头,所以为了安全起见,我们可以任意让它们以"a"开头,然后是数字。您可以使用Enumerable.Range()获取数组长度的整数列表。所以像这样:

query.Append(string.Join(",", Enumerable.Range(0, someColumnNamesArray.Count()).Select(Function(x) string.Format("@a{0}", x))))

我承认,这是一种看似复杂的代码。但它基本上做的是:

  • 创建一个从0到列名数组长度的整数范围。
  • 根据这些整数选择一个格式化字符串,创建一个字符串列表,如"@a0""@a1"等。
  • 使用string.Join()将该列表转换为单个以逗号分隔的字符串。

如果它看起来更干净,请随意在多行上执行此操作。

此时你应该有你的查询。像这样:

"INSERT INTO someTable (someColumn, anotherColumn, andAnother) VALUES (@a0, @a1, @a2)"

4. 然后您可以遍历您的数组值以添加参数:

For i As Integer = 1 To someValuesArray.Count()
    MyCommand.Parameters.AddWithValue(string.Format("@a{0}", i), someValuesArray[i])
Next