C # SQL AND условие не работает со строковыми данными - PullRequest
0 голосов
/ 10 ноября 2011

Я надеялся, что кто-то может помочь мне решить эту глупую проблему со следующим оператором SQL:

public void ApplyInference(string AnswerSelected)
    {
        int InferenceID;
        int QuestionID;
        string AnswerInference;
        int PainValue;
        int AnxietyValue;
        int DepressionValue;
        int FearValue;
        int TransportValue;
        int EmotionalValue;
        int FinancialValue;
        int PhysicalValue;
        int SpiritValue;
        int SocialValue;            

        SqlConnection NewConnection = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\QuestionsDatabase.mdf;Integrated Security=True;User Instance=True"); //"Initial Catalog=Northwind;Integrated Security=SSPI");
        SqlDataReader ReadIn = null;

        try
        {
            NewConnection.Open();
            SqlCommand GetInference = new SqlCommand("SELECT * FROM InferenceDB WHERE QuestionID =" + this.QuestionID + "AND AnswerInference =" + AnswerSelected, NewConnection);
            ReadIn = GetInference.ExecuteReader();

            while (ReadIn.Read())
            {
                InferenceID = Convert.ToInt32(ReadIn[0]);
                QuestionID = Convert.ToInt32(ReadIn[1]);
                AnswerInference = Convert.ToString(ReadIn[2]);
                PainValue = Convert.ToInt32(ReadIn[3]);
                AnxietyValue = Convert.ToInt32(ReadIn[4]);
                DepressionValue = Convert.ToInt32(ReadIn[5]);
                FearValue = Convert.ToInt32(ReadIn[6]);
                TransportValue = Convert.ToInt32(ReadIn[7]);
                EmotionalValue = Convert.ToInt32(ReadIn[8]);
                FinancialValue = Convert.ToInt32(ReadIn[9]);
                PhysicalValue = Convert.ToInt32(ReadIn[10]);
                SpiritValue = Convert.ToInt32(ReadIn[11]);
                SocialValue = Convert.ToInt32(ReadIn[12]);



                MessageBox.Show("InferenceID: " + InferenceID + "\nAnswer Value: " + AnswerInference + "\nPain value: " + PainValue + "\nSocial value: " + SocialValue);
                //LoadQuestionForm(this.FormStyle);
            }
        }
        finally
        {
            if (ReadIn != null)
            {
                ReadIn.Close();
            }

            if (NewConnection != null)
            {
                NewConnection.Close();
            }
        }
    }` 

Теперь код работает для всех остальных столбцов таблицы, кроме одного, который янужно, что это один из ответов.Я передаю значение AnswerInference из другого метода, который выглядит следующим образом:

private void Answer1Button_Click(object sender, EventArgs e)
        {
            parent.ApplyInference("Ans1");
            CloseForm();
        } 

К сожалению, я не могу заставить код работать, используя строковые данные, найденные в таблице, которую я использую.Я знаю, что это должно быть легко исправить, но я могу на всю жизнь разобраться, что происходит.Может кто-нибудь подсказать, что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

Вам нужен пробел между идентификатором вопроса и символом «и», но что более важно: вы должны использовать параметры. Изучите «SQL-инъекцию», повторное использование плана запросов и т. Д. Наиболее подходящий способ сделать это с помощью такой команды:

using(var GetInference = new SqlCommand(@"
SELECT *
FROM InferenceDB
WHERE QuestionID = @questionID AND AnswerInference = @answerInference"
       , NewConnection);
{
    GetInference.Parameters.AddWithValue("questionID", QuestionID);
    GetInference.Parameters.AddWithValue("answerInference", AnswerSelected);
    ....
}

Также - этот сложный вид try / finally можно упростить с помощью using здесь.

2 голосов
/ 10 ноября 2011

Вам нужно пробел перед AND

"SELECT *
FROM InferenceDB
WHERE QuestionID = " + this.QuestionID + " AND AnswerInference = " + AnswerSelected
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...