C# “索引和长度必须引用该字符串内的位置。”及“StartIndex 不能小于 0”

我写了一段代码是关于截取数据库的名字的可一直会出现以下的两个错误的,希望请高手帮忙看看。主要是这句会有出错的,搞了好久就是想不懂,真累,只能求助了。stringDataN... 我写了一段代码是关于截取数据库的名字的
可一直会出现以下的两个错误的,希望请高手帮忙看看。

主要是这句会有出错的,搞了好久就是想不懂,真累,只能求助了。
string DataName = mdfpath.Substring(mdfpath.LastIndexOf("\\")+1,mdfpath.Length-mdfpath.LastIndexOf("\\")-1);

错误1:
索引和长度必须引用该字符串内的位置。
参数名: length

错误2:
StartIndex 不能小于 0。参数名: startIndex

相关代码如下:
using (SqlConnection con = new SqlConnection("server=(local);pwd=" + strpwd + ";uid=" + struser + ";database=Employee"))
{
try
{
string mdfpath = textBox1.Text.Trim();//mdf路径
string DataName = mdfpath.Substring(mdfpath.LastIndexOf("\\")+1,mdfpath.Length-mdfpath.LastIndexOf("\\")-1);
DataName = DataName.Remove(DataName.LastIndexOf("_"));
string logName = mdfpath.Remove(mdfpath.LastIndexOf("\\")) + "\\" + DataName + "_log.ldf";
SqlCommand cmd = new SqlCommand();
con.Open();
cmd.Connection = con;
StringBuilder sb = new StringBuilder();
sb.Append("sp_attach_db @dbname='" + DataName + "',");
sb.Append("@filename1='" + mdfpath + "'");
if (System.IO.File.Exists(logName))
{
sb.Append(",@filename2='" + logName + "'");
}
else
{
MessageBox.Show("注意:缺少必备的log文件!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
cmd.CommandText = sb.ToString();
cmd.ExecuteNonQuery();
con.Close();
MessageBox.Show("提示:附加成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
展开
 我来答
kas68310
2011-11-12 · TA获得超过3637个赞
知道大有可为答主
回答量:1468
采纳率:33%
帮助的人:1180万
展开全部
String.Substring(int beginIndex, int Lenth);
两参数的Substring方法,截取字串时,第一参数是起始索引位,第二参数是从开始位截取的长度.
使用限制是,
1.起始参数不能小于0.因为字符串内没有负索引.
2.开始索引+截取长度不能大于字符串长,否则越界.
你可以在代码中用F9设置断点,跟踪一下看看,你的索引位是否正确,截长是否越界.

StartIndex 不能小于 0:
LastIndexOf()取索引值,当参数在字符串中不存在时返回值为-1.把这个结果做为Substring()的beginIndex那么肯定会出异常.

建议:
做一个判断容错,即验证你的字符串中是否存在你要取索引的参数字符串,不存在的话,要么跳过,要么返回提示报错.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
89801860
2011-11-12 · TA获得超过139个赞
知道小有建树答主
回答量:186
采纳率:100%
帮助的人:130万
展开全部
string DataName = mdfpath.Substring(mdfpath.LastIndexOf("\\")+1,mdfpath.Length-mdfpath.LastIndexOf("\\")-1);

有问题,举例子说明
string mdfpath = “D:\\dataPath\\data.mdb”
你的意思是要获取要获取“data”吧
namespace ConsoleApplication1
{
class Class1
{
static void Main(string[] args)
{
string path = "D:\\dataPath\\data.mdb";
string names = path.Substring(path.LastIndexOf("\\")+1, path.IndexOf(".") - path.LastIndexOf("\\")-1);
Console.WriteLine(names);
}
}
}
追问
我试过了 可还是不行的呢 真搞不能是哪里出错了啦
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
正怒月神
2011-11-12 · TA获得超过1157个赞
知道小有建树答主
回答量:710
采纳率:100%
帮助的人:500万
展开全部
string DataName = mdfpath.Substring(mdfpath.LastIndexOf("\\")+1,mdfpath.Length-mdfpath.LastIndexOf("\\")-1);
这句话的问题。
改成
string DataName = mdfpath.Substring(mdfpath.LastIndexOf("\\")+1);
第二个参数,是你要截取的长度,而不是你截取的最后一位下标。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
63715031
2011-11-12 · 超过23用户采纳过TA的回答
知道答主
回答量:94
采纳率:0%
帮助的人:78.7万
展开全部
先split到数组嘛,你那样不判断直接Substring本身风险就很大。
不过那错误确实诡异,就算mdfpath.LastIndexOf("\\")没有\也是返回-1,后面还+1,最小也是0了撒
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户

2011-11-12
展开全部
mdfpath 是一个文件路径的话,得文件名不是你那么用的,
系统提供了专门的方法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式