高手帮我看看这段代码!有什么错误?谢谢了!高分相送!急!急!急!100分相送!

时间:2021-11-02 19:44:36
这是建立数据库的代码!代码中有CHECK约束!
CREATE TABLE Passengers
(PNRNo char(5) not null Primary Key,
FlightNo char(5) not null,
TravelDate DateTime not null,
FName char(20) not null,
LName char(20) not null,
Age int not null,
Gender char(1) not null,
Class char(10) not null CHECK(Class in ('First', 'Business', 'Economy')),
SeatPref char(6) not null CHECK(SeatPref in('Aisle', 'Window')),
MealPref char(7) not null CHECK (MealPref in ('Veg', 'Non-veg')),
SSR varchar(100) null,
Status char(15) not null CHECK (Status in ('Confirmed', 'Overbooked', 'Wait-listed', 'Cancelled')))
下面是添加数据库代码!数据库中已经建立的存储过程!
总是出现错误!请帮我看看!
private void btnok_Click(object sender, System.EventArgs e)
{

DataSet dscust=new DataSet();

SqlConnection myConnection=new SqlConnection("server=wsg;database=HorizonAirways;uid=sa;password=;");

SqlCommand insertCmd=new SqlCommand("insertrecords",myConnection);
insertCmd.CommandType=CommandType.StoredProcedure;


insertCmd.Parameters.Add("@pnrno",SqlDbType.Decimal,20);
// insertCmd.Parameters["@PNRNo"].Value=TextBox1.Text;

insertCmd.Parameters.Add("@flightno",SqlDbType.NChar,20);
insertCmd.Parameters["@flightno"].Value=ddflightno.SelectedItem.Text;



insertCmd.Parameters.Add("@traveldate",SqlDbType.DateTime);
insertCmd.Parameters["@traveldate"].Value=ddtraveldate.SelectedItem.ToString();

insertCmd.Parameters.Add("@fname",SqlDbType.NChar,20);
insertCmd.Parameters["@fname"].Value=txtfname.Text ;

insertCmd.Parameters.Add("@lname",SqlDbType.NChar,20);
insertCmd.Parameters["@lname"].Value=txtlname.Text;

insertCmd.Parameters.Add("@age",SqlDbType.Int,20);
insertCmd.Parameters["@age"].Value=txtage.Text;

insertCmd.Parameters.Add("@gender",SqlDbType.NChar,20);
insertCmd.Parameters["@gender"].Value=ddgender.SelectedItem.ToString();

insertCmd.Parameters.Add("@class",SqlDbType.NChar,20);
insertCmd.Parameters["@class"].Value=ddclass.SelectedItem.ToString ();

insertCmd.Parameters.Add("@seatpref",SqlDbType.NChar,20);
insertCmd.Parameters["@seatpref"].Value=ddseatpref.SelectedItem.ToString();


insertCmd.Parameters.Add("@mealpref",SqlDbType.NChar,20);
insertCmd.Parameters["@mealpref"].Value=ddfood.SelectedItem.ToString();


insertCmd.Parameters.Add("@ssr",SqlDbType.NChar,20);
insertCmd.Parameters["@ssr"].Value=txtssr.Text;

insertCmd.Parameters.Add("@status",SqlDbType.NChar,20);
insertCmd.Parameters["@status"].Value=ddstatus.SelectedItem.ToString();
DataSet dsinv=new DataSet();

SqlDataAdapter mcommand=new SqlDataAdapter("select PNRNo from Passengers",myConnection);

mcommand.Fill(dsinv,"Passengers");

DataTable dt=new DataTable();

DataRow[] dr=new DataRow[100];

dt=dsinv.Tables["Passengers"];

string id;

id=dt.Rows[dt.Rows.Count-1]["PNRNo"].ToString();

string str;


str =id.Substring(1,3);

int y;

y=System.Convert.ToInt16(str);

y=y+1;
if(y>1&&y<=9)
{
insertCmd.Parameters["@pnrno"].Value="I00"+y;
}
if(y>9&&y<=99)
{
insertCmd.Parameters["@pnrno"].Value="I0"+y;
}
if(y>99)
{
insertCmd.Parameters["@pnrno"].Value="I"+y;
}
try 
{
insertCmd.Connection.Open();
insertCmd.ExecuteNonQuery();//到这就过不去了!
}
catch(System.FormatException exc)
{
Label1.Text="Source:"+exc.Source; //异常捕获处!
}


}

23 个解决方案

#1


斑竹实在是找不到那里错了!帮忙啊!谢谢好心人!调一半宿也没弄出来!谢谢了!

#2


你把你调试时候出现得错误信息发出来

#3


不习惯看天书,把关键的异常贴出来

#4


這個問題很好弄的。單步跟蹤以下就行了

#5


只弹出下面的异常!剩下就没有什么错误了!跟踪调试了一下到insertCmd.ExecuteNonQuery();就过无去了!

异常:System.Data

#6


把exc.Message弄出来

#7


看样子技术方面应该不是很难,我觉得应该是你的SQL写的有问题,把异常信息贴出来吧,这样容易查错

#8


异常信息  System.Data

#9


~~~~~ hxling1981(冷雨星空)~~~~
已经做了单步跟踪了,到insertCmd.ExecuteNonQuery();就引发异常,异常信息为System.Data.不知道是什么原因!请高手再来啊!

#10


首先确认一下错误源,到底是在代码方面还是在存储过程方面,可以直接用查询分析器调试存储过程先。
另仔细检查参数是否匹配,比如:
insertCmd.Parameters.Add("@traveldate",SqlDbType.DateTime);
insertCmd.Parameters["@traveldate"].Value=ddtraveldate.SelectedItem.ToString();
这段,参数是DateTime型,你给的是string的,这个string是否符合时间标准?

还有直接用Exception捕获异常,不要用FormatException,这样获取的异常信息更完整:
catch(Exception error)
{
    throw error;
}

#11


你得先看看你写的存储过程是否正确,确保在数据库中测试通过。

然后单步调试,对照存储过程的参数类型,判断你给参数的值是否合法。

    insertCmd.Parameters["@pnrno"].Value="I0"+y;
其中“I0”是什么意思?是不是“10”

若还不行,把这几行代码放在前面执行,多试试,相信问题不大,马上就可解决。

          DataSet dsinv=new DataSet();

        SqlDataAdapter mcommand=new SqlDataAdapter("select PNRNo from Passengers",myConnection);

mcommand.Fill(dsinv,"Passengers");

#12


那个是"I0",不是10,它是自动检索产生的编号,结果是"I011"或者"I001".

#13



  luck0235(风平浪静时人人都能掌舵) ( ) 信誉:100

请问如果下面这段代码如您所说的那样的话,那么时间类型应该怎么定义?
insertCmd.Parameters.Add("@traveldate",SqlDbType.DateTime);
insertCmd.Parameters["@traveldate"].Value=ddtraveldate.SelectedItem.ToString();
最后抛出的异常就是"输入字符串的格式不正确",哪里错了呢?帮忙!

#14


现在大概已经确定,是输入的数据类型不符合!哪里错了啊?
那个PNRNo号码我没个它的Values值,不知道有没有错误!给的是下面自动生成的编号!

#15


@PNRNo 这个东西做为主键,是不允许重复的,你确定你的数据表里面的记录是否有重复的?

#16


恩表中没有任何值,绝对是空的!

#17


insertCmd.Parameters.Add("@traveldate",SqlDbType.DateTime);--这里定义的是时间类型
insertCmd.Parameters["@traveldate"].Value=ddtraveldate.SelectedItem.ToString();---你这赋值的时候却给的是string类型的

#18


一堆代码,愿意这么看的人一定很有耐心

#19


要么你可以先判断ddtraveldate.SelectedItem.ToString()这个是否为空,不为空就可以利用Convert.ToDateTime(string)来转换为时间类型,同时还得加个异常,如果转换失败得有个提示或者默认值

#20


请问如果下面这段代码如您所说的那样的话,那么时间类型应该怎么定义?
insertCmd.Parameters.Add("@traveldate",SqlDbType.DateTime);
insertCmd.Parameters["@traveldate"].Value=ddtraveldate.SelectedItem.ToString();
最后抛出的异常就是"输入字符串的格式不正确",哪里错了呢?帮忙!
-----------------------------------------------------------
试试将ddtraveldate.SelectedItem.ToString()转换为DateTime型就行了,确认其值是正确的时间字符串

#21


其实在对DateTime型字段进行操作是比较容易出现格式错误的,如果条件满足,建议尽量使用如下方式:
一、直接在表中为字段建立默认值,如TravelDate DateTime default getdate()

二、用函数返回时间,如:public DateTime GetNow()

这样可以有效避免人为拼凑字符串出现的一些细节错误。

#22


在查询分析器中通过exec 存储过程名 参数 来调试,看看存储过程是否有错,如果没有那就是传值的时候数据格式不对!

#23


谢谢各位!上面提到的问题已经解决了!现在有了一个新的问题!就是自动生成PNRNo号码的那段代码!一旦使用那段代码来执行操作,就会谈出错误!代码如下!
SqlConnection myConnection=new SqlConnection("server=wsg;database=HorizonAirways;uid=sa;password=;");

SqlCommand insertCmd=new SqlCommand("insert into Passengers Values(@pnrno,@flightno,@traveldate,@fname,@lname,@age,@gender,@class,@seatpref,@mealpref,@ssr,@status)",myConnection);


DataSet dsinv=new DataSet();

SqlDataAdapter mcommand=new SqlDataAdapter("select PNRNo from Passengers",myConnection);
为什么不行?

mcommand.Fill(dsinv,"Passengers");

DataTable dt=new DataTable();

DataRow[] dr=new DataRow[100];

dt=dsinv.Tables["Passengers"];

string id;

id=dt.Rows[dt.Rows.Count-1]["PNRNo"].ToString();

string str;


str =id.Substring(1,3);

int y;

y=System.Convert.ToInt16(str);

y=y+1;
if(y>1&&y<=9)
{
insertCmd.Parameters["@pnrno"].Value="I00"+y;
}
if(y>9&&y<=99)
{
insertCmd.Parameters["@pnrno"].Value="I0"+y;
}
if(y>99)
{
insertCmd.Parameters["@pnrno"].Value="I"+y;
}

#1


斑竹实在是找不到那里错了!帮忙啊!谢谢好心人!调一半宿也没弄出来!谢谢了!

#2


你把你调试时候出现得错误信息发出来

#3


不习惯看天书,把关键的异常贴出来

#4


這個問題很好弄的。單步跟蹤以下就行了

#5


只弹出下面的异常!剩下就没有什么错误了!跟踪调试了一下到insertCmd.ExecuteNonQuery();就过无去了!

异常:System.Data

#6


把exc.Message弄出来

#7


看样子技术方面应该不是很难,我觉得应该是你的SQL写的有问题,把异常信息贴出来吧,这样容易查错

#8


异常信息  System.Data

#9


~~~~~ hxling1981(冷雨星空)~~~~
已经做了单步跟踪了,到insertCmd.ExecuteNonQuery();就引发异常,异常信息为System.Data.不知道是什么原因!请高手再来啊!

#10


首先确认一下错误源,到底是在代码方面还是在存储过程方面,可以直接用查询分析器调试存储过程先。
另仔细检查参数是否匹配,比如:
insertCmd.Parameters.Add("@traveldate",SqlDbType.DateTime);
insertCmd.Parameters["@traveldate"].Value=ddtraveldate.SelectedItem.ToString();
这段,参数是DateTime型,你给的是string的,这个string是否符合时间标准?

还有直接用Exception捕获异常,不要用FormatException,这样获取的异常信息更完整:
catch(Exception error)
{
    throw error;
}

#11


你得先看看你写的存储过程是否正确,确保在数据库中测试通过。

然后单步调试,对照存储过程的参数类型,判断你给参数的值是否合法。

    insertCmd.Parameters["@pnrno"].Value="I0"+y;
其中“I0”是什么意思?是不是“10”

若还不行,把这几行代码放在前面执行,多试试,相信问题不大,马上就可解决。

          DataSet dsinv=new DataSet();

        SqlDataAdapter mcommand=new SqlDataAdapter("select PNRNo from Passengers",myConnection);

mcommand.Fill(dsinv,"Passengers");

#12


那个是"I0",不是10,它是自动检索产生的编号,结果是"I011"或者"I001".

#13



  luck0235(风平浪静时人人都能掌舵) ( ) 信誉:100

请问如果下面这段代码如您所说的那样的话,那么时间类型应该怎么定义?
insertCmd.Parameters.Add("@traveldate",SqlDbType.DateTime);
insertCmd.Parameters["@traveldate"].Value=ddtraveldate.SelectedItem.ToString();
最后抛出的异常就是"输入字符串的格式不正确",哪里错了呢?帮忙!

#14


现在大概已经确定,是输入的数据类型不符合!哪里错了啊?
那个PNRNo号码我没个它的Values值,不知道有没有错误!给的是下面自动生成的编号!

#15


@PNRNo 这个东西做为主键,是不允许重复的,你确定你的数据表里面的记录是否有重复的?

#16


恩表中没有任何值,绝对是空的!

#17


insertCmd.Parameters.Add("@traveldate",SqlDbType.DateTime);--这里定义的是时间类型
insertCmd.Parameters["@traveldate"].Value=ddtraveldate.SelectedItem.ToString();---你这赋值的时候却给的是string类型的

#18


一堆代码,愿意这么看的人一定很有耐心

#19


要么你可以先判断ddtraveldate.SelectedItem.ToString()这个是否为空,不为空就可以利用Convert.ToDateTime(string)来转换为时间类型,同时还得加个异常,如果转换失败得有个提示或者默认值

#20


请问如果下面这段代码如您所说的那样的话,那么时间类型应该怎么定义?
insertCmd.Parameters.Add("@traveldate",SqlDbType.DateTime);
insertCmd.Parameters["@traveldate"].Value=ddtraveldate.SelectedItem.ToString();
最后抛出的异常就是"输入字符串的格式不正确",哪里错了呢?帮忙!
-----------------------------------------------------------
试试将ddtraveldate.SelectedItem.ToString()转换为DateTime型就行了,确认其值是正确的时间字符串

#21


其实在对DateTime型字段进行操作是比较容易出现格式错误的,如果条件满足,建议尽量使用如下方式:
一、直接在表中为字段建立默认值,如TravelDate DateTime default getdate()

二、用函数返回时间,如:public DateTime GetNow()

这样可以有效避免人为拼凑字符串出现的一些细节错误。

#22


在查询分析器中通过exec 存储过程名 参数 来调试,看看存储过程是否有错,如果没有那就是传值的时候数据格式不对!

#23


谢谢各位!上面提到的问题已经解决了!现在有了一个新的问题!就是自动生成PNRNo号码的那段代码!一旦使用那段代码来执行操作,就会谈出错误!代码如下!
SqlConnection myConnection=new SqlConnection("server=wsg;database=HorizonAirways;uid=sa;password=;");

SqlCommand insertCmd=new SqlCommand("insert into Passengers Values(@pnrno,@flightno,@traveldate,@fname,@lname,@age,@gender,@class,@seatpref,@mealpref,@ssr,@status)",myConnection);


DataSet dsinv=new DataSet();

SqlDataAdapter mcommand=new SqlDataAdapter("select PNRNo from Passengers",myConnection);
为什么不行?

mcommand.Fill(dsinv,"Passengers");

DataTable dt=new DataTable();

DataRow[] dr=new DataRow[100];

dt=dsinv.Tables["Passengers"];

string id;

id=dt.Rows[dt.Rows.Count-1]["PNRNo"].ToString();

string str;


str =id.Substring(1,3);

int y;

y=System.Convert.ToInt16(str);

y=y+1;
if(y>1&&y<=9)
{
insertCmd.Parameters["@pnrno"].Value="I00"+y;
}
if(y>9&&y<=99)
{
insertCmd.Parameters["@pnrno"].Value="I0"+y;
}
if(y>99)
{
insertCmd.Parameters["@pnrno"].Value="I"+y;
}