Как сделать параметризованный запрос SELECT в C #? - PullRequest
1 голос
/ 04 мая 2019

Я пытаюсь отобразить данные из таблицы в базе данных, используя DataGridView и параметризованный запрос в C # и SQL Server.

Пока я пробовал этот код:

private void button1_Click(object sender, EventArgs e)
{
        SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS01;Initial Catalog=Vagtplan;Integrated Security=True");

        SqlCommand cmd = new SqlCommand("SELECT Ansatte.ansatID = @ansat, Ansatte.Navn = @navn, Ansatte.Efternavn = @efternavn, Ansatte.Adresse = @adresse, Ansatte.Postnummer = @postnummer, Ansatte.Bynavn = @bynavn, Ansatte.Email = @email, Ansatte.Mobilnr = @mobilnr, Login_data.Brugertype = @brugertype FROM Ansatte INNER JOIN Login_data ON Ansatte.ansatID = Login_data.ansatID", con);

        cmd.Parameters.Add("@ansat", SqlDbType.Int);
        cmd.Parameters.Add("@navn", SqlDbType.VarChar);
        cmd.Parameters.Add("@eftervavn", SqlDbType.VarChar);
        cmd.Parameters.Add("@adresse", SqlDbType.VarChar);
        cmd.Parameters.Add("@postnummer", SqlDbType.Int);
        cmd.Parameters.Add("@bynavn", SqlDbType.VarChar);
        cmd.Parameters.Add("@email", SqlDbType.VarChar);
        cmd.Parameters.Add("@mobilnr", SqlDbType.Int);
        cmd.Parameters.Add("@brugertype", SqlDbType.VarChar);

        SqlDataAdapter sda = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        sda.Fill(dt);

        dataGridView2.DataSource = dt;
    }

Но я получаю следующую ошибку:

Неверный синтаксис рядом с '='

Как это исправить, чтобы я мог выбирать данные с помощью параметризованного запроса? Ожидаемый результат заключается в том, что эти данные будут отображаться в DataGridView.

1 Ответ

1 голос
/ 04 мая 2019

У вас здесь кое-что происходит, и я постараюсь вам помочь. Работая с базой данных, вы обычно делаете «выбрать ... из ...», чтобы получить данные, и «вставить в ...», чтобы добавить записи в таблицы.

Далее ваш запрос. Ваша укороченная версия. Проблема здесь в том, что вы пытаетесь присвоить значение @ansat PARAMETER INTO полю Ansatte.ansatID, которое с самого начала является неверным синтаксическим контекстом, но проверяется независимо.

SqlCommand cmd = new SqlCommand(
@"SELECT 
      Ansatte.ansatID = @ansat, 
      Ansatte.Navn = @navn, 
      Ansatte.Efternavn = @efternavn, 
      Ansatte.Adresse = @adresse...
   FROM 
      Ansatte 
         INNER JOIN Login_data 
            ON Ansatte.ansatID = Login_data.ansatID", con);

и добавление параметров ...

cmd.Parameters.Add("@ansat", SqlDbType.Int);
cmd.Parameters.Add("@navn", SqlDbType.VarChar);
cmd.Parameters.Add("@eftervavn", SqlDbType.VarChar);
cmd.Parameters.Add("@adresse", SqlDbType.VarChar);

Хорошо, что вы используете параметры, но вы просто ЗАЯВИЛИ параметры, вы никогда не присваивали им никаких фактических значений, что, по сути, приводит к тому, что следующее передается в движок

SELECT 
      Ansatte.ansatID = , 
      Ansatte.Navn = , 
      Ansatte.Efternavn = , 
      Ansatte.Adresse = 
   FROM 
      Ansatte 
         INNER JOIN Login_data 
            ON Ansatte.ansatID = Login_data.ansatID

Следовательно, вероятно, ваша ошибка, так как значение для знака = отсутствует. Теперь, чтобы фактически добавить «Значение» к вашему параметру ... Ваше объявление выглядело нормально, просто завершите его значением, которое может быть фиксированным значением, из записи в окне, настройки конфигурации, что угодно ...

cmd.Parameters.Add("@ansat", SqlDbType.Int).Value = 123;
cmd.Parameters.Add("@navn", SqlDbType.VarChar).Value = "test";
cmd.Parameters.Add("@eftervavn", SqlDbType.VarChar).Value = "more";
cmd.Parameters.Add("@adresse", SqlDbType.VarChar).Value = "done";

, что приведет к защищенному (без SQL-инъекции)

Теперь, что вы действительно можете искать. В вашей базе данных есть таблица, из которой вы хотите получить информацию. В этом случае выберите столбцы, которые вы хотите, а не значения, которые вы хотите установить. Просто запрос. Пример:

SqlCommand cmd = new SqlCommand(
@"SELECT 
      Ansatte.ansatID, 
      Ansatte.Navn, 
      Ansatte.Efternavn, 
      Ansatte.Adresse, 
      Ansatte.Postnummer, 
      Ansatte.Bynavn, 
      Ansatte.Email, 
      Ansatte.Mobilnr, 
      Login_data.Brugertype
   FROM 
      Ansatte 
         INNER JOIN Login_data 
            ON Ansatte.ansatID = Login_data.ansatID", con);

Если вы выполните вышеуказанный запрос, он вернет все записи в базе данных, которые имеют совпадающий идентификатор между каждой соответствующей таблицей.

Теперь добавьте параметры в запрос SQL-SELECT. Допустим, вам нужны только все имена в данной области PostNumber. Добавьте условие WHERE для такого поля и параметризованное значение, например

   FROM 
      Ansatte 
         INNER JOIN Login_data 
            ON Ansatte.ansatID = Login_data.ansatID
   where
      Ansatte.Postnummer = @MyPostCriteria", con );


cmd.Parameters.Add("@postnummer", SqlDbType.Int).Value = 11223;

Теперь, если вы пытаетесь добавить запись в базу данных, это будет вставка, и вы можете делать вставку только в одну таблицу за раз, и это может быть что-то вроде ниже. Вы идентифицируете таблицу и столбцы, которые хотите вставить, а затем значения в той же последовательности, что и соответствующая последовательность, как добавлено в списке в скобках вверху. Затем параметризация

SqlCommand cmd = new SqlCommand(
@"INSERT INTO Ansatte
   ( Navn,
     Efternavn,
     Adresse
   )
   values
   ( @parmForNavn,
     @parmForEfternavn,
     @parmForAdresse
   )", con);


    cmd.Parameters.Add("@navn", SqlDbType.VarChar).Value = "test";
    cmd.Parameters.Add("@eftervavn", SqlDbType.VarChar).Value = "blah";
    cmd.Parameters.Add("@adresse", SqlDbType.VarChar).Value = "123 some street";

Надеюсь, это поможет вам начать то, что вы пытаетесь достичь, либо извлекая данные из базы данных, либо вставляя в.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...