はじめに
前回は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;}}