#c# #asp.net #sql #if-statement
#c# #asp.net #sql #if-оператор
Вопрос:
Второй вопрос за все время в этом сообществе! Я новичок, и моя слабость — это операторы if внутри циклов or и другие операторы if.
Итак, вот мой сценарий. Этот метод вставляет что-либо в базу данных, но я хочу что-то проверить. Вместо того, чтобы добавлять что-либо в базу данных, я не хочу, чтобы что-либо вводилось, начинающееся с «LIFT», я хочу, чтобы метод пропускал эту строку и переходил к следующей. Есть ли способ, которым я могу запрограммировать это в этот метод? Или мне нужно написать новый метод? Большое спасибо!
public bool BatchInsert(string table, string[] values)
{
string statement = "INSERT INTO " table " VALUES(";
for (var i = 0; i < values.Length - 1; i )
{
if(values[i].Contains("'")){
values[i] = values[i].Replace("'", "''");
}
statement = "'" values[i] "', ";
}
statement = "'" values[values.Length - 1] "');";
SqlCommand comm = new SqlCommand(statement, connectionPCICUSTOM);
try
{
comm.Connection.Open();
comm.ExecuteNonQuery();
}
catch (Exception e)
{
KaplanFTP.errorMsg = "Database error: " e.Message;
}
finally
{
comm.Connection.Close();
}
return true;
}
Комментарии:
1. Остерегайтесь уязвимостей SQL-инъекций. Этот код выглядит восприимчивым к ним.
2. Пожалуйста, не называйте себя новичком . Я съеживаюсь каждый раз, когда кто-то говорит это о себе. Причина, по которой вы здесь, — учиться, а не сбивать себя с ног! 😉
3. Я знаю Джорджа! : D Я не считаю noob оскорбительным, скорее сленг для новичка xD С этого момента я буду использовать beginner
Ответ №1:
Пара подсказок. Не вводите типы = string, так как это снижает производительность. Я также предпочитаю циклы foreach, поскольку код чище и легче читается / с меньшей вероятностью испортит индекс. Также используйте оператор using для обеспечения надлежащего удаления.
Предполагая, что у вас есть ссылка на System .Linq вы можете использовать следующее. Я не тестировал его, но он должен работать:
public bool BatchInsert(string table, IEnumerable<string> values)
{
var sql = new StringBuilder();
sql.Append("INSERT INTO " table " VALUES(");
var newValues = values.Where(x => !x.StartsWith("LIFT")).Select(x => string.Format("'{0}'", x.Replace("'", "''")));
sql.Append(string.Join("","", newValues.ToArray()));
sql.Append(")");
using (var comm = new SqlCommand(statement, connectionPCICUSTOM))
{
try
{
comm.Connection.Open();
comm.ExecuteNonQuery();
}
catch (Exception e)
{
KaplanFTP.errorMsg = "Database error: " e.Message;
}
finally
{
comm.Connection.Close();
}
}
return true;
}
Комментарии:
1. Привет, Люк, спасибо. Я использую System.Linq. Если вы не возражаете зарегистрироваться завтра, я буду тестировать ваш скорректированный метод. Я дам вам знать, если что-нибудь появится, если вам интересно. Большое спасибо!
Ответ №2:
Если ваша цель состоит в том, чтобы перебирать вашу коллекцию «значений», оставляя значения, начинающиеся с «lift», и соответствующие им столбцы нетронутыми, вам, возможно, придется пересмотреть способ построения вашего запроса INSERT. Вы будете добавлять столбцы по мере необходимости, вместо того, чтобы предполагать, что каждое значение будет учитываться. В принципе, вам нужно будет использовать форму:
INSERT INTO tablename (col1, col2...) VALUES (val1, val2...)
Например:
string statement = "INSERT INTO tablename ";
string columns = "(";
string values = "(";
for (var i = 0; i < values.Length - 1; i )
{
//if values doesn't contain lift, add it to the statement
if(!values[i].contains("LIFT")){
//columnName is a collection of your db column names
columns = "'" columnName[i] "'";
values = "'" values[i] "'";
}
}
columns = ")";
values = ")";
statement = columns " VALUES " values;
Как указано в некоторых комментариях, этот подход открывает вам доступ к SQL-инъекциям. Используйте с осторожностью.
РЕДАКТИРОВАТЬ: Извините, я пропустил, где вы сказали «начинается с «LIFT». Измените строку .contains() на следующую:
if(!values[i].StartsWith("LIFT")){