簡體   English   中英

如何調試參數化的SQL查詢

[英]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:

SQL事件探查器

啟動一個新的跟蹤會話,您將看到執行的所有操作。 您也可以過濾它。

跟蹤

更多信息在這里

其他一切

一般而言,您正在尋找查詢探查器。 您可以搜索<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM