Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9521

MSSQLのデータをコマンドラインから操作してみる

$
0
0

はじめに

前回はSQLiteのデータをコマンドラインから操作してみましたが、今回はMSSQLのデータをコマンドラインから操作してみます。
https://qiita.com/namikitakeo/items/5605ef2eb56cc34f352d

実行環境

下記バージョンで動作確認しています。
- MacOS
- .NET Core 3.1

% dotnet --version
3.1.101

学習方針

コマンドプロンプトから実行する事で、Windows、Linuxにおいてもそのままできると思います。

% mkdir dbtool
% cd dbtool
% dotnet new console

まずは実行してみます。

% dotnet run
Hello World!

必要なパッケージをインストールします。

% dotnet add package System.Data.SqlClient

以下のモデルを操作します。
http://www.wings.msn.to/index.php/-/A-03/978-4-7980-4179-7/

以下のような使い方を想定しています。

% dbtool

Usage: dbtool -options [file path]

options
    -e          export user from MSSQL
    -i          import user to MSSQL
    -d          delete user from MSSQL
    -v          display version
    -h          display help message

% dbtool -v

MSSQL module: version 202002

% dbtool -e users.txt

% type users.txt
Id      Name    Email   Birth   Married Memo
1       テスト太郎              2001-01-01 01:01:01     1       テスト1
2       テスト次郎              2002-02-02 02:02:02     0       テスト2
dbtool.conf
CONNECTION  Data Source=localhost;Initial Catalog=Sample;User Id=sa;Password=Password#1;
ENCODING    utf-8
DELIMITER   tab
COLUMNS Id,Name,Email,Birth,Married,Memo
TABLE   Members
Program.cs
usingSystem;usingSystem.IO;usingSystem.Text;usingSystem.Data.SqlClient;classProgram{staticstringCONNECTION;staticstringENCODING;staticstringDELIMITER;staticstringCOLUMNS;staticstringTABLE;staticvoidMain(string[]args){if(args.Length<1||args.Length>2){help();return;}if(args.Length==1){switch(args[0]){case"-v":version();break;default:help();break;}return;}using(StreamReadersr=newStreamReader(newFileStream("dbtool.conf",FileMode.Open),Encoding.GetEncoding("utf-8"))){while(sr.Peek()>0){Stringline=sr.ReadLine();string[]values=line.Split('\t');switch(values[0]){case"CONNECTION":CONNECTION=values[1];break;case"ENCODING":ENCODING=values[1];break;case"DELIMITER":DELIMITER=values[1];break;case"COLUMNS":COLUMNS=values[1];break;case"TABLE":TABLE=values[1];break;}if(DELIMITER=="tab")DELIMITER="\t";}}switch(args[0]){case"-i":import(args[1]);break;case"-e":export(args[1]);break;case"-d":delete(args[1]);break;default:help();break;}return;}staticvoidimport(stringparam){stringsqlcmd;using(SqlConnectioncn=newSqlConnection()){cn.ConnectionString=CONNECTION;cn.Open();Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);using(StreamReadersr=newStreamReader(newFileStream(@param,FileMode.Open),Encoding.GetEncoding(ENCODING))){while(sr.Peek()>0){Stringline=sr.ReadLine();string[]values=line.Split(DELIMITER);string[]columns=COLUMNS.Split(',');if(values[0]==columns[0]){continue;}else{sqlcmd="MERGE "+TABLE+" USING (SELECT distinct '"+values[0]+"' AS "+columns[0]+" FROM "+TABLE+") TAB_B ON "+TABLE+"."+columns[0]+"=TAB_B."+columns[0]+" WHEN MATCHED THEN UPDATE SET ";for(inti=1;i<columns.Length;i++){if(i>1)sqlcmd+=",";sqlcmd+=TABLE+"."+columns[i]+"=";if(values[i].Length==0)sqlcmd+="NULL";elsesqlcmd+="'"+values[i]+"'";}sqlcmd+=" WHEN NOT MATCHED THEN INSERT ("+COLUMNS+") VALUES (";for(inti=0;i<columns.Length;i++){if(i>0)sqlcmd+=",";if(values[i].Length==0)sqlcmd+="NULL";elsesqlcmd+="'"+values[i]+"'";}sqlcmd+=");";}using(SqlTransactiontrans=cn.BeginTransaction()){SqlCommandcmd=cn.CreateCommand();cmd.Transaction=trans;cmd.CommandText=sqlcmd;cmd.ExecuteNonQuery();trans.Commit();}}}cn.Close();}return;}staticvoidexport(stringparam){using(SqlConnectioncn=newSqlConnection()){cn.ConnectionString=CONNECTION;cn.Open();using(varcmd=cn.CreateCommand()){cmd.CommandText="SELECT "+COLUMNS+" FROM "+TABLE;using(SqlDataReaderreader=cmd.ExecuteReader()){string[]columns=COLUMNS.Split(',');stringmessage="";for(inti=0;i<columns.Length;i++){if(i>0)message+=DELIMITER;message+=columns[i];}message+="\r\n";while(reader.Read()){for(inti=0;i<columns.Length;i++){if(i>0)message+=DELIMITER+reader[columns[i]].ToString();}message+="\r\n";}Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);File.WriteAllText(@param,message,Encoding.GetEncoding(ENCODING));}cn.Close();}}return;}staticvoiddelete(stringparam){using(SqlConnectioncn=newSqlConnection()){cn.ConnectionString=CONNECTION;cn.Open();Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);using(StreamReadersr=newStreamReader(newFileStream(@param,FileMode.Open),Encoding.GetEncoding(ENCODING))){while(sr.Peek()>0){string[]columns=COLUMNS.Split(',');stringsqlcmd="DELETE FROM "+TABLE+" WHERE "+columns[0]+" = '"+sr.ReadLine()+"'";using(SqlTransactiontrans=cn.BeginTransaction()){SqlCommandcmd=cn.CreateCommand();cmd.Transaction=trans;cmd.CommandText=sqlcmd;cmd.ExecuteNonQuery();trans.Commit();}}}cn.Close();}return;}staticvoidversion(){Console.WriteLine("\nMSSQL module: version 202002\n");return;}staticvoidhelp(){Console.WriteLine("\nUsage: dbtool -options [file path]\n");Console.WriteLine("options");Console.WriteLine("    -e          export user from MSSQL");Console.WriteLine("    -i          import user to MSSQL");Console.WriteLine("    -d          delete user from MSSQL");Console.WriteLine("    -v          display version");Console.WriteLine("    -h          display help message\n");return;}}

Viewing all articles
Browse latest Browse all 9521

Trending Articles