Параметр команды SQL не может преобразовать строку в int - PullRequest
0 голосов
/ 17 октября 2019

У меня есть команда SQL для добавления данных из коллекции в мою базу данных SQL. Кажется, все работает нормально, за исключением случаев, когда я пытаюсь передать нечисловые символы в мое поле Описание в таблице БД. Похоже, он не принимает строковые значения.

Класс My Collection

    public class LotData
    {
        public string Lot;
        public string Description { get; set; }
        public int PO { get; set; }
        public string MfgPart { get; set; }
    }

Моя команда SQL

          private const string strConn = "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\Matthew\\QCast.mdf;Integrated Security=True;Connect Timeout=30";


    private void Button_Click_1(object sender, RoutedEventArgs e)
    //send data from DataGrid to database
    {
        using (var conn = new SqlConnection(strConn))
        {
            conn.Open();

            try
            {
                foreach (var lotData in lot)
                {
                    using (var command = new SqlCommand("INSERT into LotData Values (@LOTnum, @WOnum, @POnum, @Description, @MFGpartNO)", conn))
                    {

                        command.Parameters.AddWithValue("LOTnum", lotData.Lot);
                        command.Parameters.AddWithValue("WOnum", "50-50-100");
                        command.Parameters.AddWithValue("POnum", lotData.PO);
                        command.Parameters.Add("Description",SqlDbType.Text , lotData.Description);
                        command.Parameters.AddWithValue("MFGpartNO", lotData.MfgPart);

                        command.ExecuteNonQuery();
                    }
                }
            }

            finally
            {
                conn.Close();
            }
        }

У меня проблема с этой строкой -

command.Parameters.Add("Description",SqlDbType.Text , lotData.Description);

Ошибка, которую я получаю, «не может быть преобразована из stirng в int». Я не хочу int Я хочу строку

Я также попробовал:

   command.Parameters.AddWithValue("Description",lotData.Description);

Затем я получаю исключение времени выполнения - тип операнда clash: int несовместим с текстом '

Моя настройка таблицы SQL такова:

CREATE TABLE [dbo].[LotData] (
    [TransID]     INT           IDENTITY (1, 1) NOT NULL,
    [WOnum]       NCHAR (10)    NULL,
    [LOTnum]      NVARCHAR (50) NULL,
    [Description] TEXT          NULL,
    [POnum]       INT           NULL,
    [MFGpartNO]   NCHAR (10)    NULL,
    CONSTRAINT [PK_LotData] PRIMARY KEY CLUSTERED ([TransID] ASC)

Как мне решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

Ваша проблема не в содержимом свойства Description, а в попытке передать тип String параметру Int32: см. Страницу MSDN для SqlParameterCollection.Add . Вы увидите, что способ, которым вы звоните, работает только тогда, когда вы предоставляете номер, потому что String представление Int32 неявно преобразуется из String в Int32. Вы должны указать ширину столбца в этом параметре, а затем добавить значение, установив свойство после инициализации параметра.

SqlParameter parm = command.Parameters.Add("Description", SqlDbType.Text, 500);
parm.Value = lotData.Description;
1 голос
/ 17 октября 2019

Здесь есть несколько вещей, которые нужно распаковать. Во-первых, вы всегда должны указывать столбцы при использовании INSERT, чтобы он знал , какой параметр идет куда , то есть

INSERT into LotData (LOTnum, WOnum, POnum, Description, MFGpartNO)
Values (@LOTnum, @WOnum, @POnum, @Description, @MFGpartNO);

Если это не помогает, то да, еслипараметр должен быть int, но string: вам нужно использовать int.Parse самостоятельно. Я подозреваю, вышесказанное будет работать, хотя.

Наконец;вам может быть проще использовать инструмент типа «Dapper» здесь:

conn.Execute(@"INSERT into LotData (LOTnum, WOnum, POnum, Description, MFGpartNO)
Values (@Lot, @WOnum, @PO, @Description, @MfgPart)",
    lot.Select(lotData => new { // args, invoked per item
        lotData.Lot,
        WOnum = "50-50-100",
        lotData.PO,
        lotData.Description,
        lotData.MfgPart
    }));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...