Неверное имя столбца при попытке вставить буквенно-цифровое значение в базу данных - PullRequest
0 голосов
/ 28 мая 2019

В принципе, у меня есть некоторый код, который берет (1) буквенно-цифровой или (2) числовой серийный номер и увеличивает их. Все работает для числовых серийных номеров, но когда я пытаюсь вставить буквенно-цифровой серийный номер, он выдает ошибку «неверное имя столбца».

Я просмотрел множество постов с "недопустимым именем столбца", и ни один из них, похоже, не отвечает на мой вопрос. Я установил точки останова и запустил код для обоих случаев (числовой и буквенно-цифровой), и я получаю одинаковые типы данных. В основном все выглядит правильно, поэтому я в растерянности.

Следующий код показывает, как я увеличиваю в обоих случаях. Обратите внимание, что для буквенно-цифрового приращения я вызываю метод IncrementAlphaNumeric, который принимает переменную «Output», которая является результатом запроса 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 Ответ

1 голос
/ 28 мая 2019

Как объяснено в комментариях, вы никогда не должны объединять строки для построения вашего оператора 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...