我正在尝试创建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,现在想象在我的列表中有很多记录,如name
,description
,还有其他查询的参数。如何创建类似的结构来添加此参数?
答案 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))))
我承认,这是一种看似复杂的代码。但它基本上做的是:
"@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