尝试在数据库中插入字母数字值时,列名无效

时间:2019-05-28 13:45:36

标签: c# sql

基本上,我有一些代码采用(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)的数据库正确表中。

1 个答案:

答案 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();
}