sql >> Database >  >> RDS >> Sqlserver

Van .NET kan ik de volledige SQL-string krijgen die is gegenereerd door een SqlCommand-object (met SQL-parameters)?

Een eenvoudige lus die alle parameternamen door hun waarden vervangt, geeft je iets dat lijkt op wat het eindresultaat is, maar er zijn verschillende problemen.

  1. Omdat de SQL nooit echt opnieuw wordt opgebouwd met behulp van de parameterwaarden, hoeft u geen rekening te houden met zaken als nieuwe regels en aanhalingstekens
  2. Parameternamen in opmerkingen worden nooit verwerkt op basis van hun waarde, maar laten zoals ze zijn

Als die er zijn, en rekening houdend met parameternamen die met dezelfde tekens beginnen, zoals @NAME en @NAME_FULL , kunnen we alle parameternamen vervangen door de waarde die op de plaats van die parameter zou staan:

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

er is hier echter nog één probleem mee, en dat is als een parameter een string is, dan is de SQL die er aanvankelijk zo uitziet:

SELECT * FROM yourtable WHERE table_code = @CODE

ziet er als volgt uit:

SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES

Dit is duidelijk geen legale SQL, dus we moeten ook rekening houden met enkele parametertypes:

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. Kan geen verbinding maken met MySQL in Cloudbees CommunicationsException:communicatieverbinding mislukt

  2. Hoe verander ik het eigendom van sommige tabellen in een database van postgres naar een andere gebruiker?

  3. Hoe kan ik ALLEEN records van gisteren selecteren?

  4. Vreemd sorteerprobleem in PHP, mysql met utf8-gegevens