powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / в MS SQL из C#
7 сообщений из 32, страница 2 из 2
в 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
7 сообщений из 32, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / в MS SQL из C#
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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