sql >> Database teknologi >  >> RDS >> Sqlserver

Fra .NET kan jeg få den fulde SQL-streng genereret af et SqlCommand-objekt (med SQL-parametre)?

En simpel løkke, der erstatter alle parameternavne med deres værdier, vil give dig noget, der ligner slutresultatet, men der er flere problemer.

  1. Da SQL'en faktisk aldrig bliver genopbygget ved hjælp af parameterværdierne, behøver ting som nye linjer og anførselstegn ikke tages i betragtning
  2. Parameternavne i kommentarer behandles aldrig for deres værdi, men efterlades som de er

Med dem på plads og under hensyntagen til parameternavne, der starter med de samme tegn, såsom @NAME og @NAME_FULL , kan vi erstatte alle parameternavne med den værdi, der ville være i stedet for den parameter:

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

der er dog et problem tilbage med dette, og det er, hvis en parameter er en streng, så ser SQL'en, der oprindeligt ser sådan ud:

SELECT * FROM yourtable WHERE table_code = @CODE

vil se sådan ud:

SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES

Dette er tydeligvis ikke lovlig SQL, så vi skal også tage højde for nogle parametertyper:

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. CakePHP Model Query Return Data Formatering

  2. Er primærnøgler passé?

  3. Sådan konverteres mssql-script til mysql

  4. Mysqldump:Opret kolonnenavne til indsættelser ved sikkerhedskopiering