基本上,我有一些代码采用(1)字母数字或(2)数字序列号并将其递增。一切都适用于数字序列号,但是当我尝试插入字母数字序列号时,会出现“无效列名”错误。
我在这里查看了很多“无效的列名”帖子,但它们似乎都没有回答我的问题。我已经设置了断点并针对两种情况(数字和字母数字)运行了代码,并且得到了相同的数据类型。基本上一切似乎都正确排列,所以我很茫然。
以下代码显示了两种情况下我如何递增。请注意,对于字母数字增量,我正在调用方法IncrementAlphaNumeric,该方法采用变量“输出”,这是对表进行排序并获取最后一个序列号的SQL查询的结果。
// Increment Numeric Serial Numbers
if (isNum)
{
int lastNumber = Int32.Parse(Output);
int[] ints = Enumerable.Range(lastNumber + 1, printQuantity).Select(i => (int)i / 1).ToArray();
increments = ints.Select(x => x.ToString()).ToArray();
output.AppendText("Serial numbers to print: " + string.Join(", ", increments));
}
// Increment AlphaNumeric Serial Numbers
if (!isNum)
{
for (int i = 0; i < printQuantity; i++)
{
increments[i] = IncrementAlphaNumeric(Output);
snList.Add(increments[i]);
Output = increments[i];
}
output.AppendText("Serial numbers to print: " + string.Join(", ", increments));
}
最后,我使用Stringbuilder如下将数据插入数据库:
// (5) Store new SNs in Database
StringBuilder sb = new StringBuilder();
foreach (string newSns in increments)
{
sb.AppendLine("INSERT INTO [Manufacturing].[dbo].[Device.Devices]([SerialNumber],[DeviceTypeID]) VALUES(" + newSns + "," + dType +")");
}
using (SqlCommand insertCommand = new SqlCommand(sb.ToString(), cnn))
{
var executeNonQuery = insertCommand.ExecuteNonQuery();
}
同样,它适用于数字,但不适用于字母数字。当我将断点放到代码中并逐步执行时,每种情况下的数据类型(字符串)都是相同的,数字和字母数字。
我得到的错误消息再次是“无效的列名”。基本上,预期结果应该是将序列号(无论是数字还是字母数字)插入基于设备类型(dType)的数据库正确表中。
答案 0 :(得分:1)
正如注释中所解释的,永远不要连接字符串以构建sql语句。
在您的情况下,我假设您要使用一条语句在数据库中插入多个记录。也可以使用参数并手动构建VALUES部分或查询来完成此操作(可从Sql Server 2008获得此语法)
// Sample values, replace them with your code that builds the increments array
string[] increments = new string[] {"VALUE1", "VALUE2","VALUE3", "VALUE4"};
// Invariant part of your query
string baseQuery = "INSERT INTO [Manufacturing].[dbo].[Device.Devices]([SerialNumber],[DeviceTypeID]) VALUES";
// Fixed value for the type
string dType = "42";
List<SqlParameter> prms = new List<SqlParameter>();
List<string> placeHolders = new List<String>();
// Build a list of parameter placeholders and a list of those parameter and their values
for(int x = 0; x < increments.Length; x++)
{
placeHolders.Add($"(@p{x},{dType})");
prms.Add(new SqlParameter { ParameterName = $"@p{x}", SqlDbType = SqlDbType.NVarChar, Value = increments[x]});
}
// Put the text together
string queryText = baseQuery + string.Join(",", placeHolders);
// This should be the final text
// INSERT INTO [Manufacturing].[dbo].[Device.Devices]([SerialNumber],[DeviceTypeID])
// VALUES(@p0,42),(@p1,42),(@p2,42),(@p3,42)
using (SqlCommand insertCommand = new SqlCommand(queryText, cnn))
{
// Add all parameters to the command...
insertCommand.Parameters.AddRange(prms.ToArray());
var executeNonQuery = insertCommand.ExecuteNonQuery();
}