2014-02-10 39 views
0

我有一个List<String>名为record与可能的最大Count的102.我需要拉50的元素,并将它们添加为查询参数。但是,所有50可能不存在,如果不是,那么我需要将该参数添加为DBNull.Value。下面的工作,但是有没有比检查每次索引是否存在更好的方法?一遍又一遍检查列表以查看索引是否存在?

List<String> record = new List<String>(myRecord.ToString().Split(new string[] { "^" }, StringSplitOptions.None)); 

cmd.CommandText = "INSERT INTO myTable ([Field1], [Field3], [Field7], [Field9]" 
+ ") VALUES (" 
+ "@p1, @p2, @p3, @p4)" 

if (record.ElementAtOrDefault(1) != null) 
{ 
    cmd.Parameters.AddWithValue("@p1", record[1]); 
} 
else 
{ 
    cmd.Parameters.AddWithValue("@p1", DBNull.Value); 
} 

if (record.ElementAtOrDefault(3) != null) 
{ 
    cmd.Parameters.AddWithValue("@p2", record[3]); 
} 
else 
{ 
    cmd.Parameters.AddWithValue("@p2", DBNull.Value); 
} 

if (record.ElementAtOrDefault(7) != null) 
{ 
    cmd.Parameters.AddWithValue("@p3", record[7); 
} 
else 
{ 
    cmd.Parameters.AddWithValue("@p3", DBNull.Value); 
} 

if (record.ElementAtOrDefault(9) != null) 
{ 
    cmd.Parameters.AddWithValue("@p4", record[9]); 
} 
else 
{ 
    cmd.Parameters.AddWithValue("@p4", DBNull.Value); 
} 

.... 
....repeat this for @p5 thru @p50 
.... 

cmd.ExecuteNonQuery(); 

cmd.Parameters.Clear(); 

工作方案如下:

var indexes = new List<int> { 1, 2, 4, 5, 10, 19, 20, 21, 22, 23, 24, 25, 26, 27, 32, 33, 35, 36, 38, 39, 44, 45, 46, 49, 51, 52, 53, 54, 55, 56, 57, 58, 62, 64, 65, 66, 67, 68, 69, 70, 71, 72, 79, 80, 81, 82, 83 }; 

cmd.CommandText = "INSERT INTO myTable ([Field1], [Field3], [Field7], [Field9]" 
+ ") VALUES (" 
+ "@p1, @p2, @p3, @p4)"  

List<String> record = new List<String>(myRecord.ToString().Split(new string[] { "^" }, StringSplitOptions.None)); 

var records = record.Where((item, index) => indexes.Contains(index)).ToList(); 

for (int i = 0; i < 5; i++) 
{ 
    string paramName = "@p" + (i); 

    if (i <= records.Count-1)  //index starts with a 0 
    { 
     cmd.Parameters.AddWithValue(paramName, (object)records[(i)] ?? DBNull.Value); 
    } 
    else 
    { 
     cmd.Parameters.AddWithValue(paramName, DBNull.Value); 
    } 
} 

cmd.ExecuteNonQuery(); 
cmd.Parameters.Clear(); 
+2

如何循环? –

+0

我会循环它,但'记录[计数]'和参数名称并不总是相同的,我不需要检查列表中的所有项目。 –

+1

然后将索引和参数名称之间的映射存储在['Dictionary'](http://msdn.microsoft.com/en-us/library/xfhwa508%28v=vs.110%29.aspx)中。 –

回答

2

如果您访问由索引你的元素,那么也许你可以将索引存储到List

var indexes = new List<int> { 1, 3, 7, 9 ... }; 

然后获取您的元素:

var records = record.Where((item,index) => indexes.Contains(index)).ToList(); 

然后用for循环(而不是你的if语句)

for(int i=1; i<records.Count; i++) 
{ 
    string paramName = "@p" + i; 
    cmd.Parameters.AddWithValue(paramName, records[i] ?? DBNull.Value); 
} 
+0

谢谢..这工作除非'records.Count'小于参数的数量。我看到它是否通过改变为'for(int i = 1; i <51; i ++);'并检查是否存在'records [i]',如果不存在,则将参数设置为'DBNull.Value' –

+0

这工作..谢谢!我只需要包括我之前评论中提到的支票。 –

1

完全未经测试并可能包含错误/错别字,但通常,我会做:

void ParseMyList(string[] myRecord) 
{ 
    List<String> record = new List<String>(myRecord.ToString().Split(new string[] { "^" }, StringSplitOptions.None)); 
    Dictionary<int, string> paramLookup = new Dictionary<int, string>(); 

    paramLookup.Add(1, "@p1"); 
    paramLookup.Add(3, "@p2"); 
    paramLookup.Add(7, "@p3"); 
    paramLookup.Add(9, "@p4"); 
    /* 
    .... 
    ....repeat this for @p5 thru @p50 
    .... 
    */ 

    cmd.CommandText = "INSERT INTO myTable ([Field1], [Field3], [Field7], [Field9]" 
     + ") VALUES (" 
     + "@p1, @p2, @p3, @p4)" 

    foreach (KeyValuePair<int, string> entry in paramLookup) 
    { 
     if (record.ElementAtOrDefault(entry.Value)) 
     { 
      cmd.Parameters.AddWithValue(entry.Value, record[entry.Key]); 
     } 
     else 
     { 
      cmd.Parameters.AddWithValue(entry.Value, DBNull.Value); 
     } 
    } 

    cmd.ExecuteNonQuery(); 

    cmd.Parameters.Clear(); 
} 
相关问题