2013-02-18 5 views
1

Я смотрю на пример здесь:В поисках уникальных строк в таблице SQL Server,

http://msdn.microsoft.com/en-US/library/y06xa2h1(v=vs.80).aspx

string s = "primaryKeyValue"; 
DataRow foundRow = dataSet1.Tables["AnyTable"].Rows.Find(s); 

if (foundRow != null) 
{ 
    MessageBox.Show(foundRow[1].ToString()); 
} 
else 
{ 
    MessageBox.Show("A row with the primary key of " + s + " could not be found"); 
} 

Они не указывают откуда dataSet1 берутся и это представляет некоторую базу данных?

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

EDIT:

SqlConnection myConnection = new SqlConnection("Data Source=server; Initial Catalog=Dashboard; Integrated Security=SSPI; Persist Security Info=false; Trusted_Connection=Yes"); 
SqlDataAdapter da = new SqlDataAdapter(); 

try 
     { 
      //Opens the connection to the specified database 
      myConnection.Open(); 

      //Specifies where the Table in the database where the data will be entered and the columns used 
      da.InsertCommand = new SqlCommand("INSERT INTO DashboardLibAnswer(Id,Date,Time,Question,Details,Answer,Notes,EnteredBy,WhereReceived,QuestionType,AnswerMethod,TransactionDuration)" 
       + "VALUES(@Id,@Date,@Time,@Question,@Details,@Answer,@Notes,@EnteredBy,@WhereReceived,@QuestionType,@AnswerMethod,@TransactionDuration)", myConnection); 

      //Specifies the columns and their variable type where the data will be entered 
      //Special note: Conversion from String > DateTime will cause exceptions that will only import some part of data and not everything 
      da.InsertCommand.Parameters.Add("@Id", SqlDbType.NVarChar); 
      da.InsertCommand.Parameters.Add("@Date", SqlDbType.Text); 
      da.InsertCommand.Parameters.Add("@Time", SqlDbType.Text); 
      da.InsertCommand.Parameters.Add("@Question", SqlDbType.Text); 
      da.InsertCommand.Parameters.Add("@Details", SqlDbType.Text); 
      da.InsertCommand.Parameters.Add("@Answer", SqlDbType.Text); 
      da.InsertCommand.Parameters.Add("@Notes", SqlDbType.Text); 
      da.InsertCommand.Parameters.Add("@EnteredBy", SqlDbType.NVarChar); 
      da.InsertCommand.Parameters.Add("@WhereReceived", SqlDbType.NVarChar); 
      da.InsertCommand.Parameters.Add("@QuestionType", SqlDbType.NVarChar); 
      da.InsertCommand.Parameters.Add("@AnswerMethod", SqlDbType.NVarChar); 
      da.InsertCommand.Parameters.Add("@TransactionDuration", SqlDbType.NVarChar); 

      //Using the global variable counter this loop will go through each valid entry and insert it into the specifed database/table 
      for (int i = 0; i < counter; i++) 
      { 
       //Iterates through the collection array starting at first index and going through until the end 
       //and inserting each element into our SQL Table 

       DataSet dashboardDS = new DataSet(); 
       da.Fill(dashboardDS, "DashboardLibAnswer"); 

       DataTable dt = dashboardDS.Tables["DashboardLibAnswer"]; 

       foreach (DataColumn col in dt.Columns) 
       { 
        if (col.Unique) 
        { 
         da.InsertCommand.Parameters["@Id"].Value = collection.getIdItems(i); 
         da.InsertCommand.Parameters["@Date"].Value = collection.getDateItems(i); 
         da.InsertCommand.Parameters["@Time"].Value = collection.getTimeItems(i); 
         da.InsertCommand.Parameters["@Question"].Value = collection.getQuestionItems(i); 
         da.InsertCommand.Parameters["@Details"].Value = collection.getDetailsItems(i); 
         da.InsertCommand.Parameters["@Answer"].Value = collection.getAnswerItems(i); 
         da.InsertCommand.Parameters["@Notes"].Value = collection.getNotesItems(i); 
         da.InsertCommand.Parameters["@EnteredBy"].Value = collection.getEnteredByItems(i); 
         da.InsertCommand.Parameters["@WhereReceived"].Value = collection.getWhereItems(i); 
         da.InsertCommand.Parameters["@QuestionType"].Value = collection.getQuestionTypeItems(i); 
         da.InsertCommand.Parameters["@AnswerMethod"].Value = collection.getAnswerMethodItems(i); 
         da.InsertCommand.Parameters["@TransactionDuration"].Value = collection.getTransactionItems(i); 
         da.InsertCommand.ExecuteNonQuery(); 
        } 
       } 

       //Updates the progress bar using the i in addition to 1 
       _worker.ReportProgress(i + 1); 

      } // end for 

      //Once the importing is done it will show the appropriate message 
      MessageBox.Show("Finished Importing"); 

     } // end try 
     catch (Exception exceptionError) 
     { 
      //To show exceptions thrown just uncomment bellow line 
      //rtbOutput.AppendText(exceptionError.ToString); 

     } // end catch 

     //Closes the SQL connection after importing is done 
     myConnection.Close(); 

    } 
+0

Это DataSet http://msdn.microsoft.com/en-us/library/system.data.dataset.aspx – msmucker0527

+0

check [this] (http://stackoverflow.com/questions/9806166/how-to -create-sql-connection-with-c-sharp-code-behind-access-the-sql-server-the) и искать принятый ответ. что «учебник» может быть очень полезен для вас. – BrOSs

ответ

1

если вы заполнить набор данных от адаптера данных, вы будете в состоянии следовать той же логике - http://msdn.microsoft.com/en-us/library/bh8kx08z(v=vs.71).aspx

Это может быть стоит показать, что вы на самом деле должны получить конкретную помощь

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

if (dt.Rows.Find(collection.getIdItems(i)) == null)  
{ 
    // add your new row 
} 

(просто чтобы убедиться, что я сколотил быстрый тест - надеюсь, это помогает):

// MyContacts db has a table Person with primary key (ID) - 3 rows - IDs 4,5,6 
    SqlConnection myConnection = new SqlConnection("Data Source=.; Initial Catalog=MyContacts; Integrated Security=SSPI; Persist Security Info=false; Trusted_Connection=Yes"); 
     SqlDataAdapter da = new SqlDataAdapter(); 

     da.SelectCommand = new SqlCommand("select * from Person", myConnection); 

     myConnection.Open(); 

     DataSet dashboardDS = new DataSet(); 
     da.Fill(dashboardDS, "Person"); 

     dashboardDS.Tables[0].PrimaryKey = new[] { dashboardDS.Tables[0].Columns["ID"]}; 

     List<int> ids = new List<int> {4, 6, 7}; 

     foreach (var id in ids) 
     { 
      if (dashboardDS.Tables[0].Rows.Find(id) == null) 
      { 
       Console.WriteLine("id not in database {0}", id); //i.e. 7 
      } 
     } 
+0

Я добавил код. – Nick

+0

обновил мой ответ – NDJ

+0

Говорит об этом, когда я пытаюсь выполнить вышеперечисленное «Невозможно неявно преобразовать тип« System.Data.DowRow »в boolan» – Nick

1

Сначала вам нужно открыть соединение с вашей базе данных. Это отличный источник для строк подключения: The Connection String Reference.

Затем вам нужно будет заполнить набор данных данными из таблицы. Поскольку нас интересует только информация о схеме, мы выбираем только одну строку (SELECT TOP 1 ...).

Тогда мы можем идти через колонки и проверить их свойство Unique (Boolean):

string connString = 
      "server=(local)\\SQLEXPRESS;database=MyDatabase;Integrated Security=SSPI"; 
string sql = @"SELECT TOP 1 * FROM AnyTable"; 
using (SqlConnection conn = new SqlConnection(connString)) { 
    conn.Open(); 
    SqlDataAdapter da = new SqlDataAdapter(sql, conn); 
    using (DataSet ds = new DataSet()) { 
     da.Fill(ds, "AnyTable"); 
     DataTable dt = ds.Tables["AnyTable"]; 
     foreach (DataColumn col in dt.Columns) { 
      if (col.Unique) { 
       Console.WriteLine("Column {0} is unique.", col.ColumnName); 
      } 
     } 
    } 
} 

UPDATE # 1

К сожалению, я missunderstood ваш вопрос. В приведенном выше примере возвращаются уникальные столбцы, а не уникальные строки. Вы можете получить уникальные (отличные) строки, используя DISTINCT ключевое слово в SQL:

SELECT DISTINCT field1, field2, field3 FROM AnyTable 

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

Обычно слово «уникальный» используется для уникальных ограничений и уникальных индексов в базе данных жаргонов. Термин «отдельный» используется для строк, которые отличаются друг от друга.


UPDATE # 2

Обновленное вопрос, кажется, предполагает, что вы не хотите найти уникальные строки, но что вы хотите вставить уникальные строки (который является полной противоположностью).

Обычно вы выбираете отдельные элементы из такой коллекции. Однако трудно точно ответить на ваш вопрос, так как мы не знаем тип вашей коллекции.

foreach (var item in collection.Distinct()) { 

} 

UPDATE # 3

Самый простой способ вставки различных значений в таблице SQL Server будет фильтровать строки в их происхождении, при чтении их из CSV-файла; даже до их расщепления.

string[] lines = File.ReadAllLines(@"C:\Data\MyData.csv"); 
string[][] splittedLines = lines 
       .Distinct() 
       .Select(s => s.Split(',')) 
       .ToArray(); 

Теперь у вас есть отдельные (уникальные) разделенные строки, которые вы можете вставить в таблицу SQL Server.

+0

Я пробовал это. Программа выполняется отлично, но таблица SQL не обновляется. – Nick

+0

Я также добавил код в исходное сообщение, которое я использую. – Nick

+0

Есть ли способ вы можете помочь мне с кодом, так как это для меня все ново. Это очень помогло бы мне. Мой код вставлен в исходное сообщение под EDIT. – Nick

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