powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / в MS SQL из C#
25 сообщений из 32, страница 1 из 2
в MS SQL из C#
    #39655072
sibir127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
приветствую!
подскажите возможно ли в C# использовать для передачи в таблицу MS SQL Server данных из DataTable целиком,
конструкцию:
Код: c#
1.
2.
3.
4.
5.
        DataTable table = new DataTable();

string sql = "select * into [dbo].[MAP_OESK_1] from " + table.TableName; как-то так, это не работает
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.ExecuteNonQuery();


или
Код: c#
1.
2.
3.
4.
5.
6.
7.
   using (SqlConnection destinationConnection = new SqlConnection(csDestination))
            {
                destinationConnection.Open();
                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
                {
                    bulkCopy.DestinationTableName = table.TableName; или как-то так, здесь тоже не работает
                    bulkCopy.WriteToServer(table);



Модератор: Учимся использовать тэги оформления кода - FAQ
может такой реализации совсем нет в C#?
подскажите метод или есть примеры синтаксиса?
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39655091
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39655097
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sibir127приветствую!
подскажите возможно ли в C# использовать для передачи в таблицу MS SQL Server данных из DataTable целиком,

Можно - используя user-defined table type (который нужно создать на сервере).
Но в даннум случае нужно использовать, как было написано выше, SqlBulkCopy.
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39655477
sibir127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One,

В примере предполагается, что наша DataTable имеет ту же схему, что и целевая Таблица. Мне надо передать в MS SQL данные не имеющую в приемнике таблицу. В этом и вопрос, есть ли инструмент использующий возможность команды sql
Код: sql
1.
select * into TABLE from DATATABLE

в help msdn говориться, что sqlbulkcopy может передать на сервер в таблицу tempdb, но как не понятно.
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39655541
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sibir127в help msdn говориться, что sqlbulkcopy может передать на сервер в таблицу tempdb, но как не понятно.
Обычная временная таблица в одном соединении с bulk copy:
Код: 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.
var dt = new DataTable();
dt.Columns.Add("n", typeof(int));
dt.Columns.Add("s", typeof(string));
foreach(var n in Enumerable.Range(1, 5))
{
  var dr = dt.NewRow();
  dr["n"] = n;
  dr["s"] = new string(Enumerable.Repeat((char) (n + 64), 5).ToArray());
  dt.Rows.Add(dr);
}
using (var cnn = new SqlConnection("Data Source=.;Integrated Security=True"))
{
  cnn.Open();
  using (var cmd = new SqlCommand(@"
    create table #t (
      n int,
      s varchar(5)
    )
  ", cnn))
    cmd.ExecuteNonQuery();
  using (var bc = new SqlBulkCopy(cnn){DestinationTableName = "#t"})
    bc.WriteToServer(dt);
  using (var cmd = new SqlCommand("select * from #t", cnn))
  using (var reader = cmd.ExecuteReader())
    while(reader.Read())
      Console.WriteLine("{0}: {1}", reader.GetInt32(0), reader.GetString(1));
}


Код: plaintext
1.
2.
3.
4.
1: AAAAA
2: BBBBB
3: CCCCC
4: DDDDD
5: EEEEE
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39655806
sibir127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны,
это тоже решение с имеющейся на сервере созданной таблицы с известным форматом данных, а у меня приходит таблица с чем-то, не известно размер и количественный с качественным содержанием в dbf от fox.
я все умудряюсь драйвером от fox в datatable запихать данные и ищу способ затащить все в БД на ms sql server 2017 из C#.
смущает что не работает sql команда
Код: sql
1.
select * into

, где не надо знать, что тащишь в БД.
в SqlBulkCopy пока вижу, что нужна хоть убей таблица приемник со всеми известными.
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39655871
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sibir127смущает что не работает sql команда
Код: sql
1.
select * into

, где не надо знать, что тащишь в БД.
в SqlBulkCopy пока вижу, что нужна хоть убей таблица приемник со всеми известными.
С какого это перепугу не надо знать? У select into есть секция from, где указывается источник данных, метаданные которого прекрасно известны серверу, и он их в точности копирует в создаваемую таблицу. Без метаданных это в принципе не получится.
sibir127это тоже решение с имеющейся на сервере созданной таблицы с известным форматом данных, а у меня приходит таблица с чем-то, не известно размер и количественный с качественным содержанием в dbf от fox.
я все умудряюсь драйвером от fox в datatable запихать данные и ищу способ затащить все в БД на ms sql server 2017 из C#.
1. Это временная таблица. Она имеется на сервере только в вашей сессии.
2. Есть DataTable - значит, метаданные получить можно. Разбирайте коллекцию Columns, генерите скрипт создания временной или постоянной таблицы (хотя за создание постоянных объектов базы в прикладном коде я бы отправлял подметать улицы), дальше - как было описано выше. Поиск в гугле по sqlbulkcopy create destination table в первой же ссылке выдает именно такое решение.
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39656157
sibir127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны,
СПАСИБО,
хорошая идея гуглить на англоязычных ресурсах, на русском перечитываю одни и те же примеры, не рабочие.
Код: c#
1.
2.
3.
 dataGridView1.DataSource = dt1;
            table = dt1.Copy();
            table.TableName = "dbo.dbfTable";


подскажи, а у datatable по умолчанию имя не присваивается служебное, я именовал сам так как в коде получал пустое имя.
столкнулся с проблемой выделения памяти, при копировании загруженной таблицы в 300 метров памяти не хватило.
авторНеобработанное исключение типа "System.OutOfMemoryException" в System.Data.dll
подскажи материал по обработке больших файлов, в идеале загрузить таблицу в 1,2 гига.
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39656168
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Передавать сразу всю таблицу можно. Ознакомьтесь с табличными параметрами MS SQL и их поддержкой в C#

2. Передавать много данных через этот механизм нельзя. Это просто нелепо. Для массовых загрузок используется соответствующий механизм, например SqlBulkCopy
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39656190
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sibir127,

для заливки больших объемов лучше всего сделать свою (специально заточенную) имплементацию IDataReader (ну и использовать SqlBulkCopy.WriteToServer(IDataReader))
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39656229
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sibir127подскажи материал по обработке больших файлов, в идеале загрузить таблицу в 1,2 гига.
DataTable.CreateDataReader + SqlBulkCopy.WriteToServer(IDataReader)
Или сразу передавать в SqlBulkCopy.WriteToServer тот датаридер, которым формируется DataTable (и DataTable в этом случае вообще не нужна).
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39658931
sibir127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны,
приветствую, не смог побороть загрузку из datareader
вот код, использую два подключения одно на dbf файл, другое в ms sql server, но не получается запустить sqlblkcopy(datareader).
убрал закрытие коннекта к dbf файлу, но дальше эксперимент встал, как вкопанный.
все останавливается на строке с коментарием //Недопустимая попытка вызвать FieldCount при закрытом устройстве чтения. или Недопустимая попытка вызвать GetSchemaTable при закрытом устройстве чтения.//?????
видимо я недопонимаю логики работы с datareader(
Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
 public partial class Form1 : Form
    {
        IDataReader sqlReader;
        DataTable table;
        Exception exce = new Exception();
        DateTime DayT = new DateTime();
        string sDirPath;
        string OFDfilename;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //string FilePath = "C:\\Work\\TestDBF\\"; //здесь файлы для работы
            string FilePath = sDirPath;
            DayT = DateTime.Now;

            OleDbConnection oledbconnection = new OleDbConnection();
            oledbconnection.ConnectionString = @"Provider=VFPOLEDB.1;Data Source=" + FilePath + "";
            oledbconnection.Open();
            Console.WriteLine(oledbconnection.ConnectionString.ToString()); //сомнения в коректности кода
            OleDbCommand oCmd = oledbconnection.CreateCommand();
            oCmd.CommandText = "SELECT * FROM " + OFDfilename;

            DataTable dt1 = new DataTable();
            sqlReader = oCmd.ExecuteReader(); //?
            dt1.Load(sqlReader);
            //dt1.Load(oCmd.ExecuteReader());
            //oledbconnection.Close();

            progressBar1.Maximum = dt1.Columns.Count;
            dataGridView1.DataSource = dt1;
            dataGridView1.Visible = true;
            table = dt1.Copy();
            table.TableName = "dbo.dbfTable" +DayT.Day+DayT.Hour+DayT.Minute;
            Console.WriteLine(table.TableName);
            textBox4.Text = exce.Message;
            textBox4.Visible = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Title = "Select a *.dbf File";
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                OFDfilename = openFileDialog1.FileName;
                //sDirPath = openFileDialog1.InitialDirectory;
                sDirPath = Path.GetDirectoryName(OFDfilename);
                Console.WriteLine(OFDfilename);
                Console.WriteLine(sDirPath);
                comboBox1.Text = OFDfilename;
                comboBox1.Items.Add(OFDfilename);
                //int count = comboBox1.Items.Count;
                //if (count == 6) comboBox1.Items.RemoveAt(0);
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            string sTableName="dbo.dbfTable" + DayT.Day + DayT.Hour + DayT.Minute;
            string csDestination = "Data Source=VLR1-STEN01;User ID=******;Password=********;" +
            "Initial Catalog=Test;MultipleActiveResultSets=true";
            SqlConnection sqlcon = new SqlConnection();
            sqlcon.ConnectionString = csDestination;
            sqlcon.Open();
            // checking whether the table selected from the dataset exists in the database or not
            string exists = null;
            try
            {
                string sqlSelect = "SELECT * FROM sysobjects where name = '" + table.TableName + "'";
                Console.WriteLine(sqlSelect);
                SqlCommand cmd = new SqlCommand(sqlSelect, sqlcon);
                textBox4.Text = exce.Message;
                textBox4.Visible = true;
                exists = cmd.ExecuteScalar().ToString();
            }
            catch (Exception exce)
            {
                exists = null;
            }

            // if does not exist
            if (exists == null)
            {
                // selecting each column of the datatable to create a table in the database
                foreach (DataColumn dc in table.Columns)
                {
                    progressBar1.PerformStep();
                    if (exists == null)
                    {
                        string sqlCreate = "CREATE TABLE " + table.TableName + "(" + dc.ColumnName + " varchar(MAX))";
                        Console.WriteLine(sqlCreate);

                    SqlCommand createtable = new SqlCommand(sqlCreate, sqlcon);
                    createtable.ExecuteNonQuery();
                    exists = table.TableName;
                    }
                    else
                    {
                        string sqlAlter = "ALTER TABLE " + table.TableName + " ADD " + dc.ColumnName + " varchar(MAX)";
                        Console.WriteLine(sqlAlter);
                    SqlCommand addcolumn = new SqlCommand(sqlAlter, sqlcon);
                    addcolumn.ExecuteNonQuery();
                    }
                }
                // copying the data from datatable to database table
                using (SqlBulkCopy bulkcopy = new SqlBulkCopy(sqlcon))
                {
                    try
                    {
                        bulkcopy.DestinationTableName = table.TableName;
                        bulkcopy.WriteToServer(sqlReader); //Недопустимая попытка вызвать FieldCount при закрытом устройстве чтения.  или Недопустимая попытка вызвать GetSchemaTable при закрытом устройстве чтения.//?????
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
            }
            // if table exists, just copy the data to the destination table in the database
            else
            {
                using (SqlBulkCopy bulkcopy = new SqlBulkCopy(sqlcon))
                {
                    try
                    {
                        bulkcopy.DestinationTableName = table.TableName;
                        bulkcopy.WriteToServer(sqlReader);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
            }
            sqlcon.Close();
            Console.WriteLine("Successfully to update the table.");
            textBox3.Text = "Сворачивай манатки, все...";
            textBox3.Visible = true;
            textBox4.Text = exce.Message;
            textBox4.Visible = true;
        }
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39658937
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
table - что это такое у вас за объект?
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39658940
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделайте нормальные методы с передачей всех нужных параметров, а то вообще непонятно, что вы там делаете, какой-то дельфи-стайл с кнопками и глобальными переменными
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39659340
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sibir127,

Код: c#
1.
2.
            sqlReader = oCmd.ExecuteReader(); //?
            dt1.Load(sqlReader);


Вероятней всего, после этого, sqlReader - "закрытое устройство чтения" (обычно Reader-ы "forward only", без "reset init state")
P.S. Это если пользователь-обезьянка нажимает сначала button1, а затем button2 и button3...
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39660085
sibir127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR,

Приветствую! То есть вопрос не во втором подключении к sql приёмнику, я думал проблема в двойном подключении сразу и к dbf и sql, а реадер один выбирает и он же отдает. И он где то закрывается перед выгрузкой данных.
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39660120
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39660278
sibir127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR,

Спасибо, да закрытие нашел. У Вас есть пример импорта таблицы из reader, не могу найти решение.
из datatable получается при создании в приемнике структуры таблицы, но с sqlbulkcopy из datareader построить не получается.
Если создаю datatable то Вы мне показали, что datareader тут-же закрывается.
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39660294
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sibir127,

Сон Веры ПавловныИли сразу передавать в SqlBulkCopy.WriteToServer тот датаридер, которым формируется DataTable (и DataTable в этом случае вообще не нужна).
т.е., так пробовали?
Код: c#
1.
2.
3.
            sqlReader = oCmd.ExecuteReader();
            //dt1.Load(sqlReader);
            bulkcopy.WriteToServer(sqlReader);
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39660345
sibir127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR,
да, создаю новое соединение передаю в sqlbulkcopy, но при указании table.TableName(здесь имя таблицы), ругается, что нет доступа к таблице приемнику.
Код: c#
1.
 sqlbulkcopy.DestinationTableName = table.TableName;
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39660380
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sibir127,

Ну, т.е., таблицы в БД наверное нет? Тогда можно использовать OleDbDataReader.GetSchemaTable() для создания таблицы "в приемнике". Можно, конечно, и так "коряво" как Вы делали (с предварительной заливкой данных в DataTable), но тогда открывайте два DataReader-а, один для создания DataTable, второй - для SqlBulkCopy.
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39660386
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sibir127,

а почему бы один раз не сделать необходимую(ые) таблицу(ы) "в приемнике" и не мучиться проверкой/созданием?
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39660516
sibir127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR,
Коряво, ))) потому что реализация планировалась через datatable, пока не познакомился с datareader, а при пришедшем файле более 300 Мб все это тоже развалилось, не хватает памяти.
тут послали меня на SqlBulkCopy и вот побороть самостоятельно не выходит, все примеры не содержат полную реализацию, самую простую, все примеры не рабочие.
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39660555
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sibir127и вот побороть самостоятельно не выходит, все примеры не содержат полную реализацию, самую простую, все примеры не рабочие.
Ну это только так кажется. Не поддавайтесь унынию (уныние - величайший из грехов, лучше кого-нибудь убить чем унывать). Еще раз спрошу, почему Вы не хотите создать таблицу-приемник "вручную", один раз, и затем не иметь никаких проблем с SqlBulkCopy?
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39660581
sibir127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR,

Причина во вредности характера, мне ткнули здесь, что делается это элементарно через "ленивую загрузку", а по жизни выяснилось, что руки у всех разные и при достигнутой договорённости формат и содержание в самый неподходящий момент оказываются отличными от первоначальных. решил что нужно это теперь узнать и сделать, а то спать не буду)
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / в MS SQL из C#
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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