1

ここで例を見ています:

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しており、機能を実行するために使用しています...

編集:

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();

    }
4

2 に答える 2

1

if you populate a dataset from your data adapter, you'll be able to follow the same logic - http://msdn.microsoft.com/en-us/library/bh8kx08z(v=vs.71).aspx

It might be worth showing what you actually have to get more specific help

EDIT I think I'm understanding what you want - if you fill your datatable from the already populated table, just check the item doesn't already exist before adding it - i.e.

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

(just to be sure I knocked together a quick test - hopefully this helps):

  // 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
            }
        }
于 2013-02-18T17:16:06.187 に答える
1

まず、データベースへの接続を開く必要があります。これは、接続文字列の優れたソースです: The Connection String Reference

次に、データセットにテーブルのデータを入力する必要があります。スキーマ情報のみに関心があるため、1 行のみを選択しています ( SELECT TOP 1 ...)。

次に、列を調べて、そのUniqueプロパティ (ブール値)を確認できます。

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);
            }
        }
    }
}

更新 #1

申し訳ありませんが、私はあなたの質問を誤解しました。上記の例は、一意の行ではなく、一意の列を返します。DISTINCTSQL でキーワードを使用して、一意の (異なる) 行を取得できます。

SELECT DISTINCT field1, field2, field3 FROM AnyTable

その後、上記と同じ方法でデータ テーブルを埋めることができます。

通常、「一意」という言葉は、データベース用語で一意の制約と一意のインデックスに使用されます。「異なる」という用語は、異なる行に使用されます。


更新 #2

あなたの更新された質問は、一意の行を見つけたくないが、一意の行を挿入したいことを示唆しているようです(これは正反対です)。

通常、このようなコレクションから個別のアイテムを選択します。ただし、コレクションの種類がわからないため、質問に正確に回答することは困難です。

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

}

更新 #3

SQL Server テーブルに個別の値を挿入する最も簡単な方法は、CSV ファイルから行を読み取るときに、元の行をフィルター処理することです。それらを分割する前であっても。

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

これで、SQL Server テーブルに挿入できる個別の (一意の) 分割行ができました。

于 2013-02-18T17:33:27.980 に答える