Как я могу создать таблицу базы данных из объекта system.Data.datatable?

Предположим, что у меня есть следующий код PowerShell:

$connectionstring = "... some connection ..."
$sql = "Select * from Sometable"
$tablename= 'Copy_of_Sometable' 

$cmd = New-Object system.Data.OleDb.OleDbCommand($sql,$connectionstring)
$da = New-Object system.Data.OleDb.OleDbDataAdapter($cmd)
$dt = New-Object system.Data.datatable
[void]$da.fill($dt)

Я знаю, что могу получить сценарий создания таблицы из $dt и использовать его для создания новой таблицы с заданным именем cf. например.

Но есть ли более прямой способ создать новую таблицу с заданным именем (пустой или уже заполненной) из объекта данных?


person bernd_k    schedule 14.02.2011    source источник


Ответы (3)


Я создал функцию add-sqltable, которая будет принимать данные в качестве входных данных и создавать таблицу SQL Server с помощью SMO.

Функция доступна на PoshCode и Репозиторий скриптов Scripting Guy. Я написал об этом в блоге для гостевого поста Scripting Guy.

person Chad Miller    schedule 15.02.2011

Используя System.Data.Datatable, вам в значительной степени придется использовать описанный метод.

Однако, если вы используете SQL 2008, доступен более прямой метод. a> командлет позволит вам сделать то, что предложил Ekkehard.Horner SELECT * INTO newtable FROM oldtable. (к сожалению, элемент копирования не поддерживается)

Конечно, system.Data.OleDb.OleDbCommand делает то же самое.

person Conrad Frix    schedule 14.02.2011

В зависимости от возможностей драйвера вы можете добиться успеха с помощью одного оператора SQL, например:

"SELECT * INTO newtable FROM oldtable"

С ODBC и Jet таблицы могут даже находиться в разных базах данных (ключевое слово).


Потому что мне очень нравятся команды «INSERT/SELECT INTO IN» ​​и я никогда раньше не использовал Powershell для «работы» с базой данных:

(Edited) Powershell session:

  PS C:\Documents and Settings\eh\My Documents\WindowsPowerShell>
    $CS="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<SOMEWHERE>\Nwind.mdb"
    $SQL="SELECT * INTO CusCopy FROM Customers"
    $cmd = New-Object system.Data.OleDb.OleDbCommand($SQL,$CS)
    $cmd.Connection.Open()
    $cmd.ExecuteNonQuery()
    91 

Please take the "91" as evidence that the command affected==inserted the 91
customers from the original table to the copy.

    $SQL="SELECT * INTO [customer.csv] IN '' 'text;HDR=YES;Database=<SOMEWHERE>' FROM Customers"
    $cmd = New-Object system.Data.OleDb.OleDbCommand($SQL,$CS)
    $cmd.Connection.Open()
    $cmd.ExecuteNonQuery()
    91
    dir
    Directory: <SOMEWHERE>
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        14.02.2011     22:09      13395 customer.csv
    -a---        14.02.2011     22:01    2576384 Nwind.mdb
    -a---        14.02.2011     22:09        394 schema.ini

A table .csv and a schema.ini (entry) were newly/dutifully created.
person Ekkehard.Horner    schedule 14.02.2011