Member 12586110 Ответов: 1

Ошибка C# datatable 'столбец не принадлежит таблице'


Привет, я использую приведенный ниже код для записи данных из файла, разделенного запятыми, в таблицу SQL Server и сталкиваюсь со следующей ошибкой: столбец "Id" не принадлежит таблице.

private string writetotbl(IList<string> records)
{
    string connString = ConfigurationManager.ConnectionStrings["myDBConnString"].ConnectionString;

    try
    {
        var lkup = from record in records
                         let rec = records.Split(',')
                         select new Lookup
                         {
                             Id = rec[0],
                             Code = rec[1],
                             Description = rec[2]
                         };

        DataTable dt = new DataTable();
        dt.Columns.Add(new DataColumn("@Id", typeof(int)));
        dt.Columns.Add(new DataColumn("@Code", typeof(string)));
        dt.Columns.Add(new DataColumn("@Description", typeof(string)));
        DataRow dr = dt.NewRow();

        foreach (var i in lkup)
        {
            dr = dt.NewRow();
            dr["Id"] = i.Id.Replace("\"", "");
            dr["Code"] = i.Code.Replace("\"", "");
            dr["Description"] = i.Description.Replace("\"", "");
            dt.Rows.Add(dr);
        }

        using (var conn = new SqlConnection(connString))
        {
            conn.Open();
            using (SqlBulkCopy s = new SqlBulkCopy(conn))
            {
                s.DestinationTableName = "Lookup";
                s.BatchSize = dt.Rows.Count;
                s.BulkCopyTimeout = 0;
                s.ColumnMappings.Add("Id", "Id");
                s.ColumnMappings.Add("Code", "Code");
                s.ColumnMappings.Add("Description", "Description");
                s.WriteToServer(dt);
                s.Close();
            }
            conn.Close();
        }
        return (null);
    }
    catch (Exception ex)
    {
        errmsg = ex.Message;
        return (errmsg);
    }
}


Не знаю, что может быть причиной этого.

Заранее спасибо..

Что я уже пробовал:

Не могли бы вы помочь мне с идеями? У меня есть все столбцы в файле, datatable соответствуют имени столбца в таблице базы данных и с соответствующим типом данных. Не знаю, как эта ошибка всплывает.

1 Ответов

Рейтинг:
11

OriginalGriff

Упростите свой код и попробуйте еще раз с этим:

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("@Id", typeof(int)));
DataRow dr = dt.NewRow();
dr["Id"] = 666;
Вы получите ту же ошибку.
И ошибка правильная: "столбец 'Id' не принадлежит таблице"
Однако столбец "@Id " делает это:
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("@Id", typeof(int)));
DataRow dr = dt.NewRow();
dr["@Id"] = 666;
Будет прекрасно работать.

Так что сопоставьте свои столбцы, либо изменив начальные имена:
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Id", typeof(int)));
dt.Columns.Add(new DataColumn("Code", typeof(string)));
dt.Columns.Add(new DataColumn("Description", typeof(string)));
DataRow dr = dt.NewRow();

foreach (var i in lkup)
{
    dr = dt.NewRow();
    dr["Id"] = i.Id.Replace("\"", "");
    dr["Code"] = i.Code.Replace("\"", "");
    dr["Description"] = i.Description.Replace("\"", "");
    dt.Rows.Add(dr);
}
Или изменение использования:
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("@Id", typeof(int)));
dt.Columns.Add(new DataColumn("@Code", typeof(string)));
dt.Columns.Add(new DataColumn("@Description", typeof(string)));
DataRow dr = dt.NewRow();

foreach (var i in lkup)
{
    dr = dt.NewRow();
    dr["@Id"] = i.Id.Replace("\"", "");
    dr["@Code"] = i.Code.Replace("\"", "");
    dr["@Description"] = i.Description.Replace("\"", "");
    dt.Rows.Add(dr);
}


Member 12586110

Большое спасибо...Я прошу прощения за свою глупость. Символ " @ " не привлек моего внимания.

Maciej Los

Пожалуйста, никогда не говори так о себе.

OriginalGriff

Не нужно извиняться, и это не глупо - мы все так делаем!
Я часто обнаруживаю, что читаю то, что собирался написать ... :румянец: