2017-06-12 6 views
2

解析中に値に挿入する方法がこれを行う最も効率的な方法であるかどうかはわかりません。私は各情報が文字列かint値かに基づいて格納されるロジックを分割しています。各情報のIDは、IDがIDでInfoDescriptionが名前であるInfoテーブルに格納されます。長いリストの文字列を解析中にSQLテーブルへの挿入を最適化する

ID Name   DataType 
1 weight  int 
2 price   int 
3 avilability string 

CREATE TABLE [dbo].[Info](
    [InfoID] [smallint] NOT NULL, 
    [InfoDescription] [varchar](100) NOT NULL, 
    [CreateDate] [datetime] NOT NULL 
) 

ので重量は、私は、文字列を解析しながら、このテーブルに値を挿入しようと思って、「重量」

の1のINfoIDとInfoDescriptionを持つことになります。 InfoID = 1、InfoInt = 50(0がデフォルトです)、InfoString = ""(必要があります-weight

"はい:50、価格::10、avilability重量" のようなたとえば何かのために

CREATE TABLE [dbo].[fruitLog] 
(
    [LogID] [bigint]  NOT NULL,//auto increment maybe 
    [InfoID]    [smallint]  NOT NULL, 
    [InfoInt]    [bigint]  NOT NULL, 
    [InfoString]   [varchar](100) NOT NULL, 
) 

-avilabilityがInfoID = 3、InfoInt = 0(0)はデフォルトで、InfoString = "yes" をfruitLog

のためになります

fruitLog

用)重量はint型ではなく、文字列のタイプであるので、これはロジックです私のコード:

//making a key value pair for the Info table so if I have a key of "Weight", I have it's value as 1(ID). 
Dictionary<string,int> MsgList = new Dictionary<string,int>(); 
var list = result from "SELECT * FROM Info"//didn't want to write the whole code out 
foreach(var item in list) 
{ 
    MsgList.Add(item.InfoDescription, item.InfoID); 
} 

foreach(var fruits in listOfFruits) 
{ 
    get.InfoCOMMAND();// will return something like {weight:50, price:10, avilability: yes} 

    //loop through the Info text and parse   
    { 
     if (parsedVariable.Equals("weight")) 
     { 
      InertIntoSQL(MsgList["weight"] , Convert.ToInt32(parsedVariable.value),""); 
     } 
     if (parsedVariable.Equals("price")) 
     { 
      InertIntoSQL(MsgList["price"] , Convert.ToInt32(parsedVariable.value, ""); 
     } 
     if (parsedVariable.Equals("avilability")) 
     { 
      InertIntoSQL(MsgList["avilability"] , 0 , parsedVariable.value.toString()); 
     } 
    } 
} 

InertIntoSQLはテーブルにそれらの変数を挿入します方法になります。私はこれを行うためのより効率的な方法があった場合ので、私は思っていた診断ログのための30以上の列を持っているつもりです\

。また、文字列を解析する最善の方法を知っている場合は、私に知らせてください。ありがとうございました。

+1

あなたがやっているすべてのテーブル間でデータを移動している場合、なぜ往復を作りますあなたのC#のコードをまったく使っていますか?あなたはSQLであなたのロジックを使ってクエリを実行します。各レコードのデータベースへのラウンドトリップを行っている別のプログラムをループするのではなく、1セットの操作としてこれを行うのはずっと高速です。 – alroc

+5

無関係ですが、あなたのキーに 'bigint'が必要ですか?あなたは20億以上の行を持っていると思いますか? [SQL Serverのデータ型](https://docs.microsoft.com/en-us/sql/t-sql/data-types/int-bigint-smallint-and-tinyint-transact-sql) –

+0

データを格納するときSQLでは、一度に1つの値を増やすことはできません。各インサートは別の行に移動します。だからあなたはジグザグの配列に終わる。 – jdweng

答えて

0

私はあなたが探していると思うのはSqlBulkCopyです。

private void PopulateTable(DataTable data, string tableName) 
{ 

    string connectionString = @"Server=PC40808\SQLEXPRESS;Database=Scratchpad;Trusted_Connection=True;"; 

    SqlConnection conn = new SqlConnection(connectionString); 
    conn.Open(); 
    SqlTransaction transaction = conn.BeginTransaction(); 
    try 
    { 
     SqlBulkCopy copy = new SqlBulkCopy(conn, SqlBulkCopyOptions.KeepIdentity, transaction); 
     copy.DestinationTableName = tableName; 
     copy.WriteToServer(data); 

     transaction.Commit(); 
    } 
    catch (Exception ex) 
    { 
     transaction.Rollback(); 
     MessageBox.Show(ex.ToString()); 
    } 
    finally 
    { 
     conn.Close(); 
    } 

} 

...基本的に、あなたはSQLテーブルに一致するデータテーブルを作成します。ここに私の機能は次のように見えたものだ - 私は、分析目的のためにSQLへのデータの束を取り込むために、少し前にそれを使用する必要がありました。 DataTableの行を読み込み、最後にSqlBulkCopy(System.Data.SqlClientライブラリのすべての部分)を使用してDataTableをSQLに送信します。

とにかく、役立つ場合は、空白を作成する関数です私の特定のケースのためのDataTable:

private DataTable GetBlankDTForRetrievals() 
{ 
    DataTable retVal = new DataTable("retrievals"); 
    retVal.Columns.Add("ObjectID", typeof(string)); 
    retVal.Columns.Add("DateTimeStamp", typeof(string)); 
    retVal.Columns.Add("Username", typeof(string)); 
    retVal.Columns.Add("DocClass", typeof(string)); 
    retVal.Columns.Add("Func", typeof(string)); 
    return retVal; 
} 

...だけでなく、私のDataTableを埋め機能:

private DataTable GetDataTableForSingleRetrievalFile(string fileLoc) 
{ 
    DataTable retVal = GetBlankDTForRetrievals(); 
    string[] lines = System.IO.File.ReadAllLines(fileLoc); 
    foreach(string line in lines.Where(l => l.Length > 94).Where((l) => l.StartsWith(" "))) 
    { 
     DataRow rowToAdd = retVal.NewRow(); 
     rowToAdd["ObjectID"] = line.Substring(48, 15); 
     rowToAdd["DateTimeStamp"] = line.Substring(1, 17); 
     rowToAdd["Username"] = line.Substring(32, 15); 
     rowToAdd["DocClass"] = line.Substring(69, 20); 
     rowToAdd["Func"] = line.Substring(90, 4); 
     retVal.Rows.Add(rowToAdd); 
    } 
    return retVal; 
} 
関連する問題