2017-07-06 26 views
1
string query = string.Format(@"if not exists(select id from user_detail where id_str = '" + args.Tweet.CreatedBy.IdStr + "') begin insert into user_detail(id_str,screen_name,user_name,createdate,hashtag,imageurl,message,unique_id,tweet_id)values('" + args.Tweet.CreatedBy.IdStr + "',N'" + args.Tweet.CreatedBy.ScreenName.Replace("'", "`") + "', N'" + args.Tweet.CreatedBy.Name.Replace("'", "`") + "','" + args.Tweet.CreatedAt + "',N'" + Hashtag + "',N'" + Convert.ToString() + "',N'" + args.Tweet.Text.Replace("'", "`") + "','" + Guid.NewGuid().ToString() + "','" + args.Tweet.IdStr + "') end else begin update user_detail set screen_name=N'" + args.Tweet.CreatedBy.ScreenName + "' where id_str = '" + args.Tweet.CreatedBy.IdStr + "' end"); 
+0

將最終的sql字符串賦值給本地的'string sql = ...',然後調試並檢查字符串 –

+0

在'SqlCommand'中使用'.Parameters.AddWithValue(「@」)參數化查詢是個好主意。 ColumnName「,」Value「);'否則你可能容易受到SQL注入 – Vladimir

回答

3

永不連接輸入來創建SQL。它會傷害你,傷害你並傷害你。如果您使用參數,則所有轉義問題將消失,與文化信息相關的問題以及SQL注入的風險也會消失。這也意味着您不需要通過將'更改爲反標(儘管實際上有逃避單引號的方式)來破壞人們的數據。

參數化

例如:

const string query = @" 
if not exists(select id from user_detail where id_str = @idstr) 
begin 
    insert into user_detail(id_str,screen_name,user_name,createdate,hashtag,imageurl,message,unique_id,tweet_id) 
    values(@idstr, @screenName, /*...*/) 
end 
else 
begin 
    update user_detail set screen_name= @screenName 
    -- ... 
end"; 

有很多做的實際執行方式。例如與原始ADO.NET:

using(var cmd = conn.CreateCommand()) { 
    cmd.CommandText = query; 
    cmd.Parameters.AddWithValue("idstr", idstr); 
    cmd.Parameters.AddWithValue("screenName", screenName); 
    // ... 
    cmd.ExecuteNonQuery(); 
} 

或「短小精悍」:

conn.Execute(query, new { idstr, screenName, /* ... */ }); 

在所有情況下,...表示這裏我省略了額外的東西讓你填在(該however-許多列/參數/等描述你的數據)。

+0

因爲我們想要做的 –

+0

@jeyajj片刻...編輯... –