Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Помогите разобраться (проблема с scope_identity() и SqlBulkCopy) / 6 сообщений из 6, страница 1 из 1
28.08.2012, 11:48
    #37933185
hex.style
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться (проблема с scope_identity() и SqlBulkCopy)
Народ, помогите разобраться с проблемой:
1. выполняю запрос:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
           SqlCommand InsertFiles2DB = new SqlCommand("INSERT INTO Log_TKI_Import_Files "
                + "([FileDescription], [FileBinary], [FileRegTime], [FilePath],[FileName], [FileCreateTime], [FileXML])  VALUES "
                + "(@FileDescription, @FileBinary, @FileRegTime, @FilePath,@FileName, @FileCreateTime, CONVERT(XML, @FileXML)) "
                + "SELECT scope_identity()", sqlconnect._sqlcnct);
            FileStream binaryFile = file.OpenRead();
            byte[] imageBytes = new byte[binaryFile.Length + 1];
            binaryFile.Read(imageBytes, 0, imageBytes.Length);
            binaryFile.Close();
            InsertFiles2DB.Parameters.AddWithValue("@FileBinary", imageBytes);
            InsertFiles2DB.Parameters.AddWithValue("@FileRegTime", DateTime.Now);
            InsertFiles2DB.Parameters.AddWithValue("@FilePath", file.FullName);
            InsertFiles2DB.Parameters.AddWithValue("@FileName", file.Name);
            InsertFiles2DB.Parameters.AddWithValue("@FileCreateTime", file.LastWriteTime);
InsertFiles2DB.Parameters.AddWithValue("@FileDescription", "Таблицы: "
                    + OurHeader.SelectSingleNode("tables").InnerText + ",\r\n начало сбора аналитики: "
                    + OurHeader.SelectSingleNode("dt_begin").InnerText + ",\r\n дата создания файла: "
                    + OurHeader.SelectSingleNode("dt_create").InnerText + ",\r\n дата окончания сбора аналитики: "
                    + OurHeader.SelectSingleNode("dt_end").InnerText);

                InsertFiles2DB.Parameters.AddWithValue("@FileXML", filedata.GetXml());


                try
                {
                    sqlconnect._sqlcnct.Open();
                    fid = (int)InsertFiles2DB.ExecuteNonQuery(); // fid постоянна равна "1" !!! 
                    Console.WriteLine("Файл {0} занесен в базу данных.", file);
                    log.trycatch(() => processTable(fid, doc.SelectNodes("/transaction/table")), "Ошибка при обработке файла", DebugState.Error);
                }
                catch (SqlException e)
                {
                    Console.WriteLine("Ошибка: " + e.ToString());
                    log.log2developer("Ошибка занесения в базу файла " + file, DebugState.Error, e);
                }
                sqlconnect._sqlcnct.Close();



SELECT scope_identity() всегда возвращает значение "1" !!! Я ума не приложу, в чем проблема! Если я подобный запрос пишу на SQL, то как обычно выводит последний вставленный столбец. В чем может быть проблема?
SELECT CAST(scope_identity() AS int) AS LAST_IDENTITY - тот же результат.


2. После этого выполняю:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
            foreach (string cell in _tableCols)
            {
                batchTable.Columns.Add(cell, _SqlDbType2((String)colsTypes[cell])); // колонки добавляет как надо, тип указывает правильный
            }

            foreach (string[] row in _tableData)
            {
                string colsSQL = "";
                i = 0;
                DataRow datarow = batchTable.NewRow();
                log.trycatch(() =>
                {
                    foreach (string cell in _tableCols)
                    {
                        if (row[i] == "") datarow[cell] = DBNull.Value;
                        else datarow[cell] = row[i];
                        i++;
                    }
                    batchTable.Rows.Add(datarow);//тут все значения заполняются нормально
                }, "Строку распарсить не смогли мы. Приостановлена строки загрузка. "+split(row,";"), DebugState.Error);
            }
SqlBulkCopy bulkCopy = new SqlBulkCopy(DBConnection._sqlcnct.ConnectionString, SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints);
bulkCopy.DestinationTableName = "Tablichko";
bulkCopy.WriteToServer(batchTable); // а тут эта гадость вставляет значение NULL в столбец NOT NULL, хотя в batchTable он присутствует.



Я уже базу данных заюзал 2012 SQL SERVER, естественно безрезультатно =))
В чем может быть проблема?
...
Рейтинг: 0 / 0
28.08.2012, 12:16
    #37933258
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться (проблема с scope_identity() и SqlBulkCopy)
В этом InsertFiles2DB. ExecuteNonQuery ()
...
Рейтинг: 0 / 0
28.08.2012, 13:15
    #37933447
hex.style
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться (проблема с scope_identity() и SqlBulkCopy)
А слона-то я и не приметил! Пришел к выводу, что спать надо хотя бы раз в сутки :-)
buser, Спасибо!!!

А что Вы думаете о SqlBulkCopy в контексте примера?
...
Рейтинг: 0 / 0
28.08.2012, 16:28
    #37933929
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться (проблема с scope_identity() и SqlBulkCopy)
Чудес не бывает.... Может SqlBulkCopyOptions.FireTriggers ?
Может просто чуть внимательнее нужно быть :)
...
Рейтинг: 0 / 0
28.08.2012, 16:54
    #37934010
hex.style
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться (проблема с scope_identity() и SqlBulkCopy)
Закрытие отчетного периода подкралось как обычно незаметно, а в спешке людям свойственно принимать глупые непродуманные решения. По поводу одного такого сижу уже сутки, пытаясь заставить летать уже давно мертвого зверя, и внимательность, к сожалению, падает %)

SqlBulkCopyOptions.FireTriggers нужен для запуска триггера ПОСЛЕ выполнения запроса.
Объявил заполняемое поле как NULL... все проходит замечательно (даже триггер отрабатывает), однако поле остается пустым.
Сижу-разбираюсь, в чем проблема.
...
Рейтинг: 0 / 0
28.08.2012, 18:57
    #37934272
hex.style
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться (проблема с scope_identity() и SqlBulkCopy)
Разобрался!
Дело в том, что SqlBulkCopy не делает автоматический маппинг столбцов! Если маппинг не задать, он положит значения в том порядке, в котором они расположены на сервере!!! А я наивно полагал, что он делает маппинг автоматически на основе заголовков скармливаемой таблицы. И это логично, так как можно либо скормить DataTable, либо DataRow[]. Как оказалось, это сделали для удобства =) (еще бы автомаппинг для удобство сделали, вообще было бы шикарно)
В общем, все решилось нехитрой строчкой:
Код: c#
1.
foreach (string colName in _tableCols){ bulkCopy.ColumnMappings.Add(colName, colName); }
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Помогите разобраться (проблема с scope_identity() и SqlBulkCopy) / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]