C# 从字符串集合中提取值

C# 从字符串集合中提取值,c#,asp.net,arrays,C#,Asp.net,Arrays,我有一个像这样的字符串集合 SetDEL_Stores.Add(DealerCode + "," + ItemIdentityCode.Text + "," + decimal.Parse(Qty.Text) + "," + DateTime.ParseExact(ExpireDate.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture) + "," + BatchNumber.Text); InsertDEL_Stores(SetDEL_Stor

我有一个像这样的字符串集合

SetDEL_Stores.Add(DealerCode + "," + ItemIdentityCode.Text + "," + decimal.Parse(Qty.Text) + "," + DateTime.ParseExact(ExpireDate.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture) + "," + BatchNumber.Text);

InsertDEL_Stores(SetDEL_Stores);
将值传递到
SetDEL_存储
(我的字符串集合)后,集合被删除

"S0010M,AZI002M,3,12/26/2013 12:00:00 AM,VDIQ20"
在本例中,我使用此集合中的一个值作为SQL查询的参数

    private void InsertDEL_Stores(StringCollection SC_PurLinr)
    {
        String strConnString = ConfigurationManager.ConnectionStrings["CBConnectionString"].ConnectionString;
        const String strQuery = "SELECT BatchNumber FROM DEL_Stores WHERE BatchNumber = @BatchNumber";
        SqlConnection conPR = new SqlConnection(strConnString);
        SqlCommand cmdPR = new SqlCommand();
        cmdPR.Parameters.AddWithValue("@BatchNumber", SC_PurLinr.IndexOf("4"));
        cmdPR.CommandType = CommandType.Text;
        cmdPR.CommandText = strQuery;
        cmdPR.Connection = conPR;

            conPR.Open();
            SqlDataReader sdr = cmdPR.ExecuteReader();
            while (sdr.Read())
            {
                TextBox1.Text = sdr["BatchNumber"].ToString();
            }

            conPR.Close();
            conPR.Dispose();
     }
执行之后,我得到了一个错误

将nvarchar值“VDIQ20”转换为数据类型int时,转换失败

它指向那条线

while (sdr.Read())
但是如果我设置参数,比如
cmdPR.Parameters.AddWithValue(“@BatchNumber”,“VDIQ20”)正常情况下,我可以将正确的值设置为预期的文本框

我能做些什么来解决这个问题?请帮帮我。

SC_PurLinr.IndexOf(“4”)
不会返回我认为您所想的结果。它返回int,而不是string

对于示例字符串,它找不到“4”,返回-1

所以你的问题是
“从BatchNumber=-1的Delu存储中选择BatchNumber”

为了检查
BatchNumber=-1
数据库是否将BatchNumber(nvarchar)转换为int,但它不能,这就是您收到此错误的原因

相反,您应该为
StringCollection
编制索引,以获取您不想调用的元素
IndexOf
方法。

.IndexOf(“4”)
返回一个
int
,而不是
字符串

编辑:

我想你还有一些问题。当您应该传递单个字符串时,您正在将整个StringCollection传递给此方法。我认为在这种情况下不需要使用StringCollection

比如:

var singleItem = SC_PurLinr[0]; 
InsertDEL_Stores(singleItem);
将您的方法更改为:

private void InsertDEL_Stores(string singleItem)

....

cmdPR.Parameters.AddWithValue("@BatchNumber", singleItem.Split(',')[4]);

除了佩里的回答。(编辑以更正BatchNumber的索引)

如果您试图访问第四个字符串(
StringCollection
是零索引集合类型)。你需要这样做

cmdPR.Parameters.AddWithValue("@BatchNumber", SC_PurLinr[3]);

这将为您提供第四个值
SC_PurLinr
,看起来它就是您要查找的批号。

如果您没有注意到,我在6分钟前已经说过了。给出同样的答案有什么意义呢?真的,我坐在办公桌前聊天,花了几分钟的时间才解决了这个问题。这不是自动刷新。但是,这是一个让试图帮助别人的人失去信心的好方法。干得好。我一定不再帮你了。你的零钱是17:58,我的零钱是18:02,也就是4分钟,因为你好像不会数数。多人可以在您知道的同一时间点击一个页面并回答。获取索引之类的错误超出范围。必须为非负且小于集合的大小。是@Evan lewis,,我尝试了解决方案(SC_PurLinr[3]),但没有获取错误,如索引超出范围。必须为非负且小于集合的大小。请使用断点在调试器中检查集合的大小。确保您正在尝试访问最后一个值(看起来像是您的批号)。将
SC_PurLinr[n]
中的值更改为要查找的批次号的索引值。另外,请确保将完整的字符串集合传递给该方法。@Smith阅读了Brad在上面的回答,如果集合中确实有4个值,我的解决方案将有效。但您只添加了一个字符串。获取索引之类的错误超出范围。必须是非负数且小于集合的大小。@Smith,我认为您应该只使用
字符串,而不是
StringCollection
。看我的编辑;我会更新的。巴哈正在赶往这个。。。只是在他的收藏中看到的。只有一个字符串。太明显了!不错;)