私はC#の新機能ですので、これが明白な質問であればお詫び申し上げますが、答えが見つからないようです。私は、生のSQLコマンドを受け取り、データベースに直接渡すクライアントアプリケーションを書いています。 select
、update
、insert
、またはdelete
のいずれかになるかわかりません。 select
の場合、結果はDataTable
になります。それが他のものであれば、それが成功したかどうか、または実行にエラーがあるかどうかを知りたい(たとえば、影響を受ける行はありません)。NPGSQLで未処理のSQLを実行すると「行がありません」というエラーを取得する方法は?
update
またはdelete
のエラーが返されないことを確認する前に、現在以下のコードを実行しています。行には影響しません。私はコードを書式化しましたが、私がやろうとしていることを理解するのに十分なままにしました。これが私の最初の質問ですから、私の質問を文脈化するためのヒントがあれば、分かち合いましょう。
class Client
{
static void Main(string[] args)
{
Config.LoadConfig();
Db.Init();
var testQuery1 = "select * from test where 1=1";
var testQuery2 = "update test set value='value3' where name = 'name3'";
var testQuery3 = "insert into test (id, name, value, date) values (4,'name4','value4',current_timestamp)";
Db.Query(testQuery1);
Db.PrintResults();
Db.Query(testQuery2);
Db.PrintResults();
Db.Query(testQuery3);
Db.PrintResults();
}
}
/// <summary>
/// Universal database class.
/// </summary>
public static partial class Db
{
private static IUniversalDatabase _dbUniConn;
/* Database Results */
public static string ErrorCode { get; private set; }
public static string ErrorMessage { get; private set; }
public static int RowCount { get; private set; }
public static double ExecutionSeconds { get; private set; }
public static DataTable Data { get; private set; } = new DataTable();
public static void Init(string connString, Type dbType)
{
try
{
_connString = connString;
_connType = dbType;
switch (_connType)
{
case Db.Type.PostgreSQL:
_dbUniConn = new PostgresDatabase(_connString);
break;
...
}
}
}
public static void Open()
{ ... _dbUniConn.Open(); ... }
public static void Close()
{ ... _dbUniConn.Close(); ... }
public static void Query(string cmdString)
{
var start = DateTime.Now;
Open();
/* Reset Data */
Data.Reset();
RowCount = 0;
ErrorMessage = "";
ErrorCode = "";
/* Execute Query */
_dbUniConn.Query(cmdString);
/* Execution Time */
ExecutionSeconds = (DateTime.Now - start).TotalSeconds;
Debug.Write("Database: Execution Time: " + ExecutionSeconds.ToString() + " seconds", Debug.TraceLevel.Info);
/* RowCount and Error Message */
RowCount = Data.Rows.Count;
Debug.Write("Database: Returning " + RowCount.ToString() + " rows", Debug.TraceLevel.Info);
Debug.Write("Database: Error (" + ErrorCode + "): " + ErrorMessage, Debug.TraceLevel.Info);
Close();
}
public class PostgresDatabase : IUniversalDatabase
{
private NpgsqlConnection _dbConn;
public PostgresDatabase(string connString)
{ _dbConn = new NpgsqlConnection(connString); }
public void Open()
{ _dbConn.Open(); }
public void Close()
{ _dbConn.Close(); }
public void Dispose()
{ _dbConn.Dispose(); }
public void Query(string cmdString)
{
NpgsqlCommand cmd = new NpgsqlCommand(cmdString, _dbConn);
NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd);
cmd.CommandType = System.Data.CommandType.Text;
try
{
da.Fill(Data);
}
catch (Exception e)
{
MatchCollection configVar = Regex.Matches(e.Message.ToString(), @"^(?<code>.*?): (?<msg>.*?)$");
foreach (Match match in configVar)
{
ErrorCode = match.Groups["code"].Value.ToString();
ErrorMessage = match.Groups["msg"].Value.ToString();
}
}
da.Dispose();
cmd.Dispose();
}
}
}
どのようなエラーが表示されますか? –
私はこの部分をより明確にすべきでした。私はポイントは、挿入/更新/削除が何らかの理由で失敗したときにエラーメッセージを受け取ることができないということです。どの行にも影響を与えない 'update'を実行するか、または不正なデータを持つ' insert'を実行すると、私は 'ErrorCode'と' ErrorMessage'でDBエラーを取得したいと思います。 – Cassova
これは「テストソート」と思われるので、監査中に「更新前に監査テーブルに挿入」を実行してから「挿入後」を実行してください。それからあなたは "da feet"の意味を知っています。つまり、データベースにヒットしたかどうかは分かります。 –