Created
December 25, 2012 16:23
-
-
Save bouzuya/4374051 to your computer and use it in GitHub Desktop.
ADO.NET example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| var providerName = "Npgsql"; | |
| var connectionString = "Server=db.bouzuya.jp;Port=5432;User Id=postgres;Password=postgres;Database=mydb"; | |
| var sql = "INSERT INTO users(username,password) VALUES(:username, :password)"; | |
| var parameters = new Dictionary<string, object>() { {"username", "bouzuya"}, {"password", "password"} }; | |
| var factory = DbProviderFactories.GetFactory(providerName); | |
| using (var connection = factory.CreateConnection ()) { | |
| connection.ConnectionString = connectionString; | |
| connection.Open (); | |
| using (var transaction = connection.BeginTransaction ()) { | |
| try { | |
| int result; | |
| using (var command = connection.CreateCommand ()) { | |
| command.Connection = connection; | |
| command.Transaction = transaction; | |
| command.CommandType = CommandType.Text; | |
| command.CommandText = sql; | |
| foreach (var parameter in parameters) { | |
| var p = command.CreateParameter(); | |
| p.ParameterName = parameter.Key; | |
| p.Value = parameter.Value; | |
| command.Parameters.Add (p); | |
| } | |
| result = command.ExecuteNonQuery (); | |
| } | |
| transaction.Commit (); | |
| return result; | |
| } catch { | |
| transaction.Rollback (); | |
| throw; | |
| } | |
| } | |
| } | |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
providerName は System.Data.SqlClient や Oracle.DataAccess.Client なんかを指定することが多いです。system.data/DbProviderFactories に登録されている invariantName です。
connectionString は .Net Data Provider ごとに固有なので、一概には言えません。これは Npgsql 用のものです。一般には Data Source や Pooling などがあります。この例はパスワードをクリアテキストで指定していますね。しかも postgres のパスワードを晒しています。驚きですね。
sql は RDBMS 固有です。Npgsql で PostgreSQL へ接続する場合には、
:でも@でもよさそうです。個人的には普段 Oracle が多いので、:に慣れています。あとは DbProviderFactory を使ったよくある流れです。DbProviderFactory 経由で取得すれば直接 DLL を参照せずに済みます。実際には SQL 文などが特定の RDBMS に依存してしまい、あまり意味がないことが多いですが。
あとは BeginTransaction に IsolationLevel を指定したいとか、 DbParameter の DbType を明示したいとか言った要望があるかもしれません。ひとまず、このサンプルではここまでにします。