[英]How to debug parameterized SQL query
我使用C#建立數據庫連接,然后使用臨時SQL獲取數據。 這個簡單的SQL查詢非常易於調試,因為我可以記錄SQL查詢字符串。 如果我使用參數化的SQL查詢命令,是否有任何方法可以記錄SQL查詢字符串以進行調試?
我想這就是它。 將此代碼放置在配置了查詢命令的位置,然后將在debugSQL
中將要執行的SQL語句中
string debugSQL = cmd.CommandText;
foreach (SqlParameter param in cmd.Parameters)
{
debugSQL = debugSQL.Replace(param.ParameterName, param.Value.ToString());
}
SQL服務器
對於SQL Server,您可以使用SQL Server Profiler:
啟動一個新的跟蹤會話,您將看到執行的所有操作。 您也可以過濾它。
更多信息在這里 。
其他一切
一般而言,您正在尋找查詢探查器。 您可以搜索<RDBMS NAME> query profiler
並且應該找到有用的東西。
使用庫的“調試”標志通常是最簡單的解決方案。 但是您依賴於可能對您說謊的庫,或者至少隱藏了它將要執行的某些操作(例如,psycopg靜默更改默認隔離級別)。
在DBMS方面,您始終可以激活日志記錄。 這樣做的好處是,無論客戶端庫執行什么操作,您都將獲得確切的SQL請求。 在這方面,它比庫的“調試”標志更好。 但是,在某些DBMS上,日志記錄語句可能非常慢(PostgreSQL就是這種情況)。
如果您有足夠的特權,另一種解決方案是在網絡上使用嗅探器。 Wireshark可以解碼許多DBMS的協議並提出實際的SQL請求。
在PostgreSQL上 ,激活日志記錄是通過以下方式在postgresql.conf
完成的:
log_statement = 'all' # none, ddl, mod, all
我通常也使用:
log_connections = on
log_disconnections = on
log_duration = on
log_hostname = on
equisde的答案很有幫助,但是要處理bool和char類型,我需要這種變化:
string debugSQL = dbCommand.CommandText;
foreach (SqlParameter param in dbCommand.Parameters)
{
string val = param.Value.ToString();
switch (param.DbType)
{
case System.Data.DbType.AnsiString:
val = "'" + val + "'";
break;
case System.Data.DbType.Boolean:
val = (val == "True" ? "1" : "0");
break;
}
debugSQL = debugSQL.Replace("@" + param.ParameterName, val);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.