2014-10-31 2 views
1

Я новичок в кодировании и в настоящее время занимаюсь работой с базами данных sql. Я должен создать базу данных, отобразить всю информацию в базе данных в консольном приложении, а затем выполнить поиск определенного «customerID» (один из столбцов в базе данных) и отобразить информацию об этом клиенте.Поиск и отображение данных базы данных SQL C#

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

Пожалуйста, помогите!

SqlCeConnection con1 = new SqlCeConnection(conStr); 
con1.Open(); 
SqlCeCommand cmd1 = new SqlCeCommand("SELECT * FROM shippingTable", con1); 
SqlCeDataReader dr = cmd1.ExecuteReader(); 

Console.WriteLine("Enter your customer ID (C1, C2 or C3"); 
string userValue = Console.ReadLine(); 

while (dr.Read()) 
{ 

    if (userValue == "C1") 
     { 
      Console.WriteLine(dr[1] + "Your product was shipped: " + dr[5]); 
      break; 
     } 

    if (userValue == "C2") 
     { 
      Console.WriteLine(dr[1] + "Your product was shipped: " + dr[5]); 
      break; 
     } 
    if (userValue == "C3") 
     { 
      Console.WriteLine(dr[1] + "Your product was shipped: " + dr[5]); 
      break; 
     } 
    else 
     { 
      Console.WriteLine("Something went wrong, you typed in the wrong customer ID"); 
      break; 
     } 
} 
+2

Просьба прояснить ваше исправленное поведение. Как я вижу из вашего кода - вы показываете точно такую ​​же вещь во всех случаях ввода пользователя. В чем причина этого? –

+0

Удалите 'break;', чтобы вы не выходили из цикла чтения; (используйте 'else' или' switch' - 'break' не перескакивает с' if')) –

+0

Я хотел проверить, был ли пользователь введен и имя для конкретного идентификатора клиента было одинаковым, а затем выписать Результаты. Это были некоторые инструкции, которые я получил от репетитора. – Nork

ответ

1

Вы должны фильтровать данные на стороне базы данных, используя предложение where в вашем запросе sql.

"SELECT * FROM shippingTable WHERE CustomerID = @CustomerID"

Затем, когда вы создали команду, вам нужно будет пройти в параметре и его значение:

cmd1.Parameters.Add("CustomerID", SqlDbType.VarChar).Value = userValue;

Это означает, что вам не придется писать код, который выполняет поиск через возможные значения идентификаторов клиентов в коде - потому что что бы вы сделали, если бы было миллион клиентов?

Вы можете использовать "SELECT * FROM shippingTable WHERE CustomerID = '" + userValue + "'", но, как @AndyKorneyev указывает в комментариях ниже, это оставит ваш код открытым для инъекций.

Аналогичным образом использование cmd1.Parameters.AddWithValue("CustomerID", userValue) будет иметь силу, но будет иметь проблемы с конверсией, которые повлияют на производительность приложения, также указала @AndyKorneyev с хорошей ссылкой на статью, объясняющую проблему.

Рассмотрим что-то больше, как это:

 Console.Write("Enter your customer ID: "); 
     string userValue = Console.ReadLine(); // Get this before you even try and make a connection. 

     using(SqlConnection con1 = new SqlConnection(conStr)) // using is used here because these objects implement IDisposable 
     { 
      con1.Open(); // Using will take care of closing the connection when it leaves scope. 
      using(SqlCommand cmd1 = new SqlCommand("SELECT * FROM shippingTable WHERE CustomerId = @CustomerId", con1)) 
      { 
       cmd1.Parameters.Add("CustomerID", SqlDbType.VarChar).Value = userValue; 
       using(SqlDataReader dr = cmd1.ExecuteReader()) 
       { 
        if(dr.Read()) 
        { 
         Console.WriteLine(dr[ 1 ] + " Your product was shipped: " + dr[ 5 ]); 
        } 
        else 
        { 
         Console.WriteLine("Nothing was returned for Customer Id '" + userValue + "'"); 
        } 
       } 
      } 
     } 
+4

Не учите ОП плохим вещам. Конкатенация SQL-запроса является простым способом SQL-инъекции. Вместо этого используйте параметризованные запросы. –

+0

Очень истинное утверждение и OP должны учитывать, что параметры лучше - я обновлю свой ответ. –

+1

гораздо лучше, но все же не идеально;) Обратите внимание, что 'AddWithValue' - ужасный метод, и его следует избегать, если это возможно. Вот хорошая статья, аргументирующая это: http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ –

0

Путь к считывать данные из базы данных в приложение консоли будет:

/* This approach will allow for parameters, avoiding Sql Injection. 
    It also shows the 'TOP' for result, to limit the data your pulling. The larger 
    the table, the slower the application. (Just example, tweak for real world.) 
*/ 
string query = "SELECT TOP 50 * FROM [Database] WHERE ([Id] = @Id AND [Type] = @Type);"; 
using(SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DbInConfig"].ConnectionString)) 
    using(SqlCommand command = new SqlCommand(query, connection)) 
    { 
      /* The 'Using' will implement IDispose, which will save 
       you resources, as once an item it out of scope will be 
       collected by Garbage Collection. 
      */ 

      connection.Open(); // Self explanatory, open your database connection. 

      // You can declare a parameter should you need one like this: 
      command.Parameters.AddWithValue("@Id", id); 

      /* The downfall with 'AddWithValue' is it attempts to infer 
      the database type, which can be wrong. */ 

      command.Parameters.Add("@Id", SqlDbType.Int).Value = type; 

      /* The generic add has you manually specifying the type, 
      less room for error especially with big data. 

      // Execute a Reader, to Read the data. 
      using(SqlDataReader reader = command.ExecuteReader()) 
       while(reader.Read()) 
       { 
        // Within this scope, you can transmit data anyway you'd like. 
        if(reader["Column"] != DBNull.Value) 
         Console.WriteLine(reader["Column"].ToString()); 

        /* You could populate a data model, or list to send 
         to console in a tabular format. Or do what I did 
         above which would show them one at a time. */ 
       } 
    } 

Это поможет вам начать работать с базой данных, надеюсь, прояснить немного для вас. Используйте SqlDataReader для чтения данных из вашего запроса. Дополнительная информация here.

Смежные вопросы