【发布时间】:2017-06-17 06:57:06
【问题描述】:
我是 C# 新手,所以如果这是一个显而易见的问题,我深表歉意,但我似乎无法找到答案。我正在编写一个客户端应用程序,它采用原始 SQL 命令并将其直接传递给数据库。我不知道是select、update、insert 还是delete。如果是select,我想将结果放入DataTable。如果是别的,我想知道它是否成功或执行是否有错误(例如:没有行受到影响)。
我目前正在执行以下代码,然后我发现它不会返回任何错误 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中获取数据库错误,但我看不到这样的事情。 -
既然这似乎是“测试-排序”,为什么不做一些审计,即在更新运行期间“将之前插入到审计表中”,然后“插入之后”。然后你就会知道“大脚”的意思——我的意思是,你会知道它是否命中了数据库。
-
我已经更新了我的问题,使其更加关注
update和delete的“无行”。我不熟悉“在审核表之前插入”。我得调查一下。 -
这有帮助吗? postgresql.org/message-id/…