Входная строка была не в правильном формате.на SQL Выберите как заявление? - PullRequest
0 голосов
/ 16 сентября 2010

Я создал этот выбор хранимой процедуры:

@SerialNumber varchar(50)
@PalletNumber varchar(50)  ------> Datatype int 

SELECT  
  ,SerialNumber
  , PalletNumber
 FROM  dbo.FG_FILLIN 
 WHERE (SerialNumber LIKE @SerialNumber + '%' )
 AND (PalletNumber =  @PalletNumber)

Я изменяю @palletnumber на varchar, потому что Like '%' не принимает int.


Доступ к моим данным:

 public DataSet FGSearchAll(FillinEntity fin)
        {
        SqlConnection conn = new SqlConnection(connStr);
        SqlCommand cmd = new SqlCommand("FGSearchAll", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        DataSet dSet = new DataSet();
        SqlDataAdapter da = new SqlDataAdapter(cmd);

       cmd.Parameters.Add("@SerialNumber", SqlDbType.VarChar, 50).Value = 
       fin.SerialNumber;
       cmd.Parameters.Add("@PalletNumber", SqlDbType.Int).Value = 
               fin.PalletNumber;

        try
        {
            conn.Open();

            da.Fill(dSet, "FGDATA");

            conn.Close();
        }
        catch (SqlException)
        {
            throw;
        }
        return dSet;
    }

Пользовательский интерфейс:

private void SearchAll()
    {

        BAL obj = new BAL();
        FillinEntity fin = new FillinEntity();
         fin.SerialNumber = txtSearchSerial.Text ;
         **fin.PalletNumber = Convert.ToInt32(txtSearchPallet.Text);**

        try
        {
            dsdata = obj.FGSearchAll(fin);

            if (dsdata.Tables[0].Rows.Count < 1)
            {
                MessageBox.Show("No Record Found!");

            }
            else
            {
                dgWIP.DataSource = dsdata;
                dgWIP.DataMember = "FGDATA";
            }
        }
        catch (ApplicationException ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

Все работает нормально, если у меня есть ввод Оба, но когда я просто ищу серийный номер, а в паллете пустое значение, появляется ошибка.

Есть идеи?

Спасибо, с уважением.

Ответы [ 4 ]

1 голос
/ 16 сентября 2010

Эта ошибка не имеет ничего общего с вашим SQL.

Ошибка в строке, отмеченной звездочкой в ​​вашем сообщении.

fin.PalletNumber = Convert.ToInt32(txtSearchPallet.Text);

Если txtSearchPallet.Text пуст, вы пытаетесь преобразовать пустую строку в целое число, и это то, что дает вам «Входная строка была не в правильном формате». исключение.

Прежде всего вам необходимо определить, является ли номер поддона пустой строкой, и присвоить -1 (скажем) вашему экземпляру FillInEntity.

например.

fin.PalletNumber = 
(txtSearchPallet.Text == "") ? -1 : Convert.ToInt32(txtSearchPallet.Text);

Это остановит исключение.

Тогда я бы продолжил следующим образом:

Измените строку, присваивающую значение параметра следующему

DbParameter pallet = cmd.Parameters.Add("@PalletNumber", SqlDbType.Int);
if (fin.PalletNumber == -1) 
    pallet.Value = DBNull.Value
else
    pallet.Value = fin.PalletNumber

Измените сохраненный процесс так, чтобы @PalletNumber имел тип данных int, а предложение where было

WHERE 
(
   SerialNumber LIKE @SerialNumber + '%' 
   AND 
   (
       @PalletNumber is null 
       or 
       PalletNumber =  @PalletNumber
   )
)
0 голосов
/ 16 сентября 2010

Вам нужен динамический sql или используйте IsNull

@PalletNumber varchar(50) = NULL -- default null

SELECT  *
 FROM  @FG_FILLIN
 WHERE (SerialNumber LIKE  @SerialNumber + '%' )
 AND (PalletNumber =  @PalletNumber OR @PalletNumber IS NULL)

Ваш выбор также имеет синтаксическую ошибку; то есть ',' после SELECT

0 голосов
/ 16 сентября 2010

Я не думаю, что это имеет какое-либо отношение к SQL.Сообщение об ошибке

Неправильная строка вводаэто не число.

Поэтому вместо:

fin.PalletNumber = Convert.ToInt32(txtSearchPallet.Text);

Возможно, вам следует попробовать что-то вроде ...

if (!int.TryParse(txtSearchPallet.Text, out fin.PalletNumber))
{
    MessageBox.Show("Please enter a number between x and y.");
    return;
}

Это попытается повернуть строкув целое число и сохранить результат в fin.PalletNumber.Если преобразование завершается неудачно, появляется сообщение MessageBox, предупреждающее пользователя, и операция не предпринимается.

0 голосов
/ 16 сентября 2010

Вам нужно будет добавить логику в свою хранимую процедуру, чтобы проверить, что значения параметров не содержат NULL значения

Вам нужно будет сделать что-то вроде этого:

if (@PalletNumber is Null)
begin
SELECT  
  ,SerialNumber
  , PalletNumber
 FROM  dbo.FG_FILLIN 
 WHERE (SerialNumber LIKE @SerialNumber + '%' )
end
else
begin
SELECT  
  ,SerialNumber
  , PalletNumber
 FROM  dbo.FG_FILLIN 
 WHERE (SerialNumber LIKE @SerialNumber + '%' )
 AND (PalletNumber LIKE  @PalletNumber + '%')
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...