Преобразовать int в строку, сохраненную в базе данных SQL Server - PullRequest
0 голосов
/ 21 мая 2018

У меня есть база данных SQL Server с таблицей Event_Tab со столбцом Int Code.Я хочу связать это Code с конкретным string, и поэтому я не сохраняю строковые переменные в своей таблице.

Итак, я написал процедуру GetStringCode с входным параметром In16, и она возвращает нужную мне строку, затем я заполняю ее в виде списка другим параметром, сохраненным в моей таблице

Этомой код для этого:

using (SqlConnection connection = new SqlConnection(connectionstring))
using (SqlDataAdapter adapter = new SqlDataAdapter(query, connection))
{
    DataTable table = new DataTable();
    adapter.Fill(table);

    foreach(DataRow dr in table.Rows)
    {
        ListViewItem items = new ListViewItem(dr["Machine"].ToString());                    
        items.SubItems.Add(GetStringCode((short)dr["Code"]).ToString());
        items.SubItems.Add(dr["Date_time"].ToString());
        listview.Items.Add(items);
    }
}  

Если вы заметили, я сделал приведение, чтобы избавиться от ошибки

Невозможно преобразовать из объекта в короткий

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

Определенное приведение неверно

В чем проблема, потому что я не могу его найти...

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Возможно, вы столкнулись с проблемой распаковки, а не приведения типов.Переменная типа int приведёт к short.Тем не менее, упакованный int не будет приводить непосредственно к короткому.Тип значений в штучной упаковке может быть напрямую приведен только к точному типу в штучной упаковке.

int i = 100;
object o = i; // Boxed int.
short s1 = (short) i; // Works.
short s2 = (short) o; // Throws InvalidCastException.
short s3 = (short) (int) o; // Works.

DataRow хранит значения полей как object, поэтому типы значений упаковываются.Это означает, что попытка привести значение поля, заключенное в прямоугольное целое, непосредственно к short, вызывает проблему.Двухэтапное приведение (как в s3 выше) может решить проблему.

В чем разница между боксом / распаковкой и типом кастинга?

0 голосов
/ 21 мая 2018

Если таблица SQL определяет столбец для Код , как показано ниже:

CREATE TABLE Event_Tab (
    Machine varchar(255),
    Code int,
    Date_time datetime
);

Тогда тип данных из SQL не будет приведен к C # short или Int16, посколькуSQL int эквивалентен C # Int32 ( Отображение типов данных )

static void Main(string[] args)
{
    DataTable table = new DataTable();
    table.Columns.Add("Machine", typeof(string));
    table.Columns.Add("Code", typeof(SqlInt32));
    table.Columns.Add("Date_time", typeof(DateTime));

    DataRow dr = table.NewRow();
    dr.ItemArray = new object[] { "machineA", 1122, DateTime.Now };

    // Works
    Int32 i32 = ((SqlInt32)dr["Code"]).Value;

    // Throws 'Specified cast is not valid.'
    Int16 i16 = (short)dr["Code"];
}
...