Skip to content

Instantly share code, notes, and snippets.

@bouzuya
Created December 25, 2012 16:23
Show Gist options
  • Select an option

  • Save bouzuya/4374051 to your computer and use it in GitHub Desktop.

Select an option

Save bouzuya/4374051 to your computer and use it in GitHub Desktop.
ADO.NET example
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;
}
}
}
@bouzuya
Copy link
Copy Markdown
Author

bouzuya commented Dec 25, 2012

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 を明示したいとか言った要望があるかもしれません。ひとまず、このサンプルではここまでにします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment