Ошибка MySqlCommand.ExecuteNonQuery и странный c # - PullRequest
0 голосов
/ 13 ноября 2011

Я пытаюсь вставить путь к базе данных MySQL, но это работает, но это странно.То, что я нашел, это путь не путь моего каталога проекта, это что-то странное.когда я использую свою программу, результат будет " D: musicFOREIGN !! Новый пирог с пирожными. Хилари Дафф - Wake Up.mp3 ".и когда я вставляю запрос вручную из phpmyadmin, его результат " D: \ music \ FOREIGN !! \ New folder \ barat cakep \ Hilary Duff - Wake Up.mp3 ", ничего странного.Я сделал что-то не так?вот мой код:

public static void add_song(song input)
    {
        establised();
        try
        {
            MySqlCommand command = connection.CreateCommand();
            command.CommandText = string.Format("INSERT INTO song (ID_SONG, ID_GENRE, ID_CATEGORY, SONG_TITLE, SONG_ARTIST, SONG_LOCATION, SONG_PLAYED) select '', b.id_genre, c.id_category, '{0}', '{1}', '{2}', '0' from genre b, category c where b.genre = '{3}' and c.category = '{4}' ", input.title, input.artist, input.location, input.genre, input.category);
            command.ExecuteNonQuery();
        }
        catch (Exception e) { }
        release();
    }

и вот мой пример запроса:

"INSERT INTO song (ID_SONG, ID_GENRE, ID_CATEGORY, SONG_TITLE, SONG_ARTIST, SONG_LOCATION, SONG_PLAYED) select '', b.id_genre, c.id_category, 'Wake Up', 'Hilary Duff', 'D:\\music\\FOREIGN!!\\New folder\\barat cakep\\Hilary Duff - Wake Up.mp3', '0' from genre b, category c where b.genre = 'Pop' and c.category = 'international'"

Ответы [ 2 ]

3 голосов
/ 13 ноября 2011

Используйте объект MysqlParameter для передачи параметра в запрос, поэтому автоматически проверяется:

// 1. Use parameters label in the query
command.CommandText = "INSERT INTO song (ID_SONG, ID_GENRE, ID_CATEGORY, SONG_TITLE, SONG_ARTIST, SONG_LOCATION, SONG_PLAYED) select '', b.id_genre, c.id_category, @Title, @Artist, @Location, '0' from genre b, category c where b.genre = @GenRe and c.category = @category "

// 2. Define parameters used in command object
    MySqlParameter param  = new MySqlParameter();
    param.ParameterName = "@Location";
    param.Value         = input.location;

//3. Assign the parameter to the command
command.Parameters.Add(param);

//GO ahead with others parameters ...
0 голосов
/ 28 марта 2013

Вам просто нужно экранировать любую текстовую переменную, присутствующую в строке запроса.

Два символа, которые необходимо экранировать, это апостроф (') и косая черта (\).

Создать простую функцию "FixSQL"

Public Shared Function FixSQL(item As String) As String
    Dim result As String

    result = item
    result = Replace(result, "\", "\\")
    result = Replace(result, "'", "''")
    return result
End Function

Применить функцию только к переменным, которые есть в вашем sql-запросе

...