2015-03-31 7 views
1

Можно ли записывать точно каждый отдельный оператор, который SqlDataAdapter выполняет в базе данных mysql, используя метод .Update() в C#?Записывать каждый оператор SqlDataAdapter C#

(без необходимости использовать SQLProfiler или любой другой третьей стороной программка, но чистый C# код)

+0

_ «записывать точно каждое отдельное заявление» _ какие заявления? –

+0

@Tim Schmelter Операторы INSERT, DELETE и UPDATE со всеми параметрами – hYde

+0

Место, куда вы хотите войти? Файловая система? Таблица аудита в БД? Если последнее, вы всегда можете добавить триггер в свою таблицу. – BDH

ответ

2

Так я решил свою проблему, подумал, что поделюсь ею для тех, кто ищет идею.

#region generate SQL Update Script 
    static void da_RowUpdating(object sender, SqlRowUpdatingEventArgs e) 
    { 
     string sqlCommand = e.Command.CommandText; 

     for (int i = 0; i < sqlCommand.Length; i++) 
     { 
      string substring = ""; 
      string paramvalue = ""; 

      int check = 0; 
      int index = 0; 

      substring = sqlCommand.Substring(i, 1); 
      if (substring == "@") 
      { 
       if (Int32.TryParse(sqlCommand.Substring(i + 3, 1), out check)) 
       { 
        index = Convert.ToInt32(sqlCommand.Substring(i + 2, 2)); 
        paramvalue = e.Command.Parameters[Convert.ToInt32(sqlCommand.Substring(i + 2, 2)) - 1].Value.ToString(); 
        sqlCommand = sqlCommand.Remove(i, 4); 
       } 
       else 
       { 
        index = Convert.ToInt32(sqlCommand.Substring(i + 2, 1)); 
        paramvalue = e.Command.Parameters[index - 1].Value.ToString(); 
        sqlCommand = sqlCommand.Remove(i, 3); 
       } 
       sqlCommand = sqlCommand.Insert(i, paramvalue); 
      } 
     } 
     sw.WriteLine(sqlCommand); 
     sw.Flush(); 
    } 
    #endregion generate SQL Update Script 
2

Вы могли handle the DataAdapter events как RowUpdating или RowUpdated.

Так что для вашей базы данных MySql:

void OnRowUpdated(object sender, MySqlRowUpdatedEventArgs args) 
{ 
    string sql = args.Command.CommandText; 
    bool isStoredProcedure = args.Command.CommandType == CommandType.StoredProcedure; 
    foreach (MySql.Data.MySqlClient.MySqlParameter p in args.Command.Parameters) 
    { 
     string paramName = p.ParameterName; 
     DbType dbType = p.DbType; 
     MySqlDbType dbType2 = p.MySqlDbType; 
     object value = p.Value; 
    } 
} 

Эти события инициируются для каждой строки, которая получает вставленной, обновлены или удалены.

Смежные вопросы