我可以插入、更新、洗掉和搜索 MySql 資料庫
我想知道如何檢查MySql 資料庫中是否存在歌曲...
void CheckIfFileExists(String file, String dir)
{
// $mysqli = new mysqli(SERVER, DBUSER, DBPASS, DATABASE);
string song = Path.GetFileName(file);
song = MySql.Data.MySqlClient.MySqlHelper.DoubleQuoteString(song);
string ConString = " datasource = localhost; port = *;
username = ***; password = *****";
string sql = "SELECT id FROM music WHERE song = " song);
using (MySqlConnection cn = new MySqlConnection(ConString))
{
cn.Open();
using (MySqlCommand cmd = new MySqlCommand(sql, cn))
{
//if id exixts?
if (???????????)
{
// "Song exists";
}
else
{
// "Song does not exist";
InsertIntoDataBase(String file, String dir);
}
}
}
}
uj5u.com熱心網友回復:
在問題結束之前,我將直接討論真正的問題,即如何正確插入。使用 MySQL 的自定義INSERT IGNORE和引數化查詢。使用Dapper使其成為單線:
var sql=@"INSERT IGNORE INTO music
(ID,song,folder)
VALUES (1, @song,@folder)";
using (var cn= new MySqlConnection(ConString))
{
cn.Execute(sql,new {song=song,folder=@dir});
}
Dapper 將打開連接以執行命令并在之后關閉它。它將生成一個 MySqlCommand,為提供的物件中的每個屬性生成引數(@song 代表歌曲,@folder 代表檔案夾)。
INSERT IGNORE將嘗試在表中插入新行。如果已經存在具有相同主鍵的行,則 INSERT 將被忽略。
通過連接輸入生成 SQL 字串是非常危險的。再多的參考也無法防止 SQL 注入攻擊,或者更良性的轉換錯誤。如果這首歌被命名會怎樣'0'; DROP TABLE music;--?如果值是日期或數字怎么辦?查詢字串將以無效字符結尾。
另一方面,引數化查詢類似于 C# 函式。作為 RPC 呼叫的一部分,引數被傳遞到字串本身之外的服務器。服務器根據查詢生成執行計劃,并將引數值提供給編譯的執行計劃。
這些值永遠不會更改為文本或與查詢組合,因此無法注入 SQL 或最終出現型別轉換問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/411786.html
標籤:
