powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / в MS SQL из C#
32 сообщений из 32, показаны все 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
в MS SQL из C#
    #39660599
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sibir127а у меня приходит таблица с чем-то, не известно размер и количественный с качественным содержанием в dbf от fox

sibir127смущает что не работает sql команда
Код: sql
1.
select * into



Select * - это декларативный синтаксис. СУБД понимает, что делать, потому что обладает исчерпывающей информацией о структуре исходных данных.

В вашем случае данной информацией обладаете только вы.
Поэтому вы, на основании пришедшего к вам файла dbf от FoxPro вполне можете сами создать структуру требуемой таблицы.

Есть еще вариант, но тут нужно поболее прав иметь. Руками сделать linked server с драйверами от FoxPro, например смотрите здесь
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39660638
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sibir127и вот побороть самостоятельно не выходит, все примеры не содержат полную реализацию, самую простую, все примеры не рабочие.
Ну вот рабочий пример:
Код: 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.
class Program
{
  static void Main()
  {
    var sw = new Stopwatch();
    sw.Start();
    using (var cnn = new OracleConnection("User Id=scott;Password=tiger"))
    using (var cmd = new OracleCommand("select * from all_objects where owner='SYS'", cnn))
    {
      cnn.Open();
      using (var reader = cmd.ExecuteReader())
        Copy(reader);
    }
    sw.Stop();
    Console.WriteLine(sw.Elapsed);
    Console.WriteLine("done");
    Console.ReadKey(true);
  }

  static void Copy(DbDataReader reader)
  {
    var ddl = GetTableDdl(reader);
    using (var cnn = new SqlConnection("Data Source=.;Initial Catalog=stuff;Integrated Security=True"))
    using (var cmd = new SqlCommand(ddl, cnn))
    {
      cnn.Open();
      cmd.ExecuteNonQuery();
      using (var bc = new SqlBulkCopy(cnn))
      {
        bc.DestinationTableName = "dbo.MyTable";
        bc.WriteToServer(reader);
      }
    }
  }

  static string GetTableDdl(IDataReader reader)
  {
    var schema = reader.GetSchemaTable();
    if (schema == null)
      throw new ApplicationException("Schema table is null");
    var sb = new StringBuilder();
    sb.Append("create table dbo.MyTable (");
    foreach (DataRow row in schema.Rows)
      sb.Append(Environment.NewLine)
        .Append("\t")
        .Append("[")
        .Append(row["ColumnName"])
        .Append("] ")
        .Append(GetTypeById((OracleDbType)row["ProviderType"]))
        .Append(GetColumnSize(row))
        .Append((bool)row["AllowDBNull"] ? string.Empty : " NOT NULL")
        .Append(",");
    sb.Length -= 1;
    sb.Append(Environment.NewLine).Append(")");
    return sb.ToString();
  }

  static string GetTypeById(OracleDbType type)
  {
    switch(type)
    {
      case OracleDbType.Date:
        return "datetime";
      case OracleDbType.Decimal:
        return "float";
      case OracleDbType.Varchar2:
        return "varchar";
      case OracleDbType.NVarchar2:
        return "nvarchar";
      case OracleDbType.Clob:
        return "varchar(max)";
      case OracleDbType.NClob:
        return "nvarchar(max)";
      case OracleDbType.Blob:
        return "varbinary(max)";
      // итд итп
      default:
        throw new ArgumentException($"Unsupported type: {type}");
    }
  }

  static string GetColumnSize(DataRow row)
  {
    var type = (OracleDbType) row["ProviderType"];
    switch(type)
    {
      case OracleDbType.Date:
      case OracleDbType.Clob:
      case OracleDbType.NClob:
      case OracleDbType.Blob:
      case OracleDbType.Decimal:
        return string.Empty;
      case OracleDbType.Varchar2:
      case OracleDbType.NVarchar2:
        return string.Concat("(", row["ColumnSize"], ")");
      default:
        throw new ArgumentException($"Unsupported type: {type}");
    }
  }
}


Код: plaintext
1.
2.
00:00:06.6274468
done
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
use [stuff]
go
SELECT 
  p.rows AS RowCounts,
  sum(a.used_pages)*8 UsedSpaceKB
FROM sys.tables t
inner join sys.indexes i on i.object_id=t.object_id
inner join sys.partitions p on p.object_id=i.object_id and p.index_id=i.index_id
inner join sys.allocation_units a on a.container_id=p.partition_id
left outer join sys.schemas s on t.schema_id = s.schema_id
where t.object_id=object_id(N'dbo.MyTable')
group by p.rows


Код: plaintext
1.
2.
3.
4.
RowCounts            UsedSpaceKB
-------------------- --------------------
34434                4584

(1 row(s) affected)
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39660667
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sibir127при достигнутой договорённости формат и содержание в самый неподходящий момент оказываются отличными от первоначальных.
И что Вы будете делать, когда таблица-приемник уже будет содержать значительное количество данных, а данные, которые надо доливать, начнут приходить в новом формате? И потом, залить данные в таблицу-приемник это ведь не самоцель, верно? Кто-то/что-то будет работать с этими данными - там тоже могут потребоваться соответствующие изменения. Поэтому не вижу особого смысла в автоматизации создания таблицы-приемника...
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39661002
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

спасибо, очень полезный пример
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39661331
sibir127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR,

Приветствую! Замечание правильное, я решаю задачу, как ребус, но на практике все будет именно по вашему.
Сформируется таблица и будет обновляться, при изменении структуры буду разбираться с поставщиком данных.
Интересно изучить данный метод загрузки и тему загрузки данных в бд из различных источников данных, серьезной оказалась задача с загрузкой файла dbf большого размера в таблицу на ms sql server. Пойду на выходные практиковаться. Спасибо.
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39661332
sibir127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны,

Получил пищу для размышления, надо практиковаться с материалом, спасибо. На выходные есть занятие.
...
Рейтинг: 0 / 0
в MS SQL из C#
    #39662614
sibir127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны,

Все срослось, практическую задачу выполнил, надо подробнее с GetSchemaTable поработать, уж больно структура прикольная.
Еще добавить пришлось .BulkCopyTimeout = 1800; иначе соединение рвется на ходу. сейчас падает сама Visual Studio, но соединение не рвет, позволяет продолжить выполнение задачи, надо решить проблемку)
За 4 минутки переносит 1,2Гб в SQL Server из dbf файла.
СПАСИБО, всем участникам моей задачи)
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / в MS SQL из C#
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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