sql >> Databáze >  >> RDS >> Sqlserver

Mohu z .NET získat celý řetězec SQL generovaný objektem SqlCommand (s parametry SQL)?

Jednoduchá smyčka nahrazující všechny názvy parametrů jejich hodnotami vám poskytne něco podobného tomu, jaký je konečný výsledek, ale je zde několik problémů.

  1. Vzhledem k tomu, že SQL není ve skutečnosti nikdy přestavěn pomocí hodnot parametrů, není třeba brát v úvahu věci jako nové řádky a uvozovky
  2. Názvy parametrů v komentářích nejsou ve skutečnosti nikdy zpracovány podle jejich hodnoty, ale ponechány tak, jak jsou

S těmi, které jsou na místě, as ohledem na názvy parametrů, které začínají stejnými znaky, například @NAME a @NAME_FULL , můžeme všechny názvy parametrů nahradit hodnotou, která by byla na místě daného parametru:

string query = cmd.CommandText;
foreach (SqlParameter p in cmd.Parameters.OrderByDescending(p => p.ParameterName.Length))
{
    query = query.Replace(p.ParameterName, p.Value.ToString());
}

zůstává zde však jeden problém, a to pokud je parametrem řetězec, pak SQL, který zpočátku vypadá takto:

SELECT * FROM yourtable WHERE table_code = @CODE

bude vypadat takto:

SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES

Toto zjevně není legální SQL, takže musíme počítat také s některými typy parametrů:

DbType[] quotedParameterTypes = new DbType[] {
    DbType.AnsiString, DbType.Date,
    DbType.DateTime, DbType.Guid, DbType.String,
    DbType.AnsiStringFixedLength, DbType.StringFixedLength
};
string query = cmd.CommandText;

var arrParams = new SqlParameter[cmd.Parameters.Count];
cmd.Parameters.CopyTo(arrParams, 0);

foreach (SqlParameter p in arrParams.OrderByDescending(p => p.ParameterName.Length))
{
    string value = p.Value.ToString();
    if (quotedParameterTypes.Contains(p.DbType))
        value = "'" + value + "'";
    query = query.Replace(p.ParameterName, value);
}


  1. Jak se vyhnout MySQL 'Deadlock nalezený při pokusu o získání zámku; zkuste restartovat transakci'

  2. dotaz na horizontální rozložení dat mysql

  3. Datum a čas TEĎ PHP mysql (+ varianta PDO)

  4. Pivoting dat pomocí dvou sloupců