SQL INSERT 奇怪地跳过了第一条记录
SQL INSERT weirdly skipping first record
我正在从另一个 class 获取对象列表,并在我的插入查询中使用它。
不知怎的,我遇到了一个奇怪的问题 "error",因为列表中的第一个对象没有插入。
如果有人能发现我的错误,我将非常高兴!我的头一直在敲键盘有一段时间了...
var ActNoParam = new SqlParameter();
ActNoParam.ParameterName = "@ActNo";
ActNoParam.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(ActNoParam);
var CustNoParam = new SqlParameter();
CustNoParam.ParameterName = "@CustNo";
CustNoParam.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(CustNoParam);
var DelpriParam = new SqlParameter();
DelpriParam.ParameterName = "@DelPri";
DelpriParam.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(DelpriParam);
var CustPrg3Param = new SqlParameter();
CustPrg3Param.ParameterName = "@CustPrg3";
CustPrg3Param.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(CustPrg3Param);
var NmParam = new SqlParameter();
NmParam.ParameterName = "@Nm";
NmParam.SqlDbType = SqlDbType.VarChar;
cmd.Parameters.Add(NmParam);
var Gr6Param = new SqlParameter();
Gr6Param.ParameterName = "@Gr6";
Gr6Param.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(Gr6Param);
var CreUsrParam = new SqlParameter();
CreUsrParam.ParameterName = "@CreUsr";
CreUsrParam.SqlDbType = SqlDbType.VarChar;
cmd.Parameters.Add(CreUsrParam);
var CreDtParam = new SqlParameter();
CreDtParam.ParameterName = "@CreDt";
CreDtParam.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(CreDtParam);
for (int i = 1; i < customers.Count; i++)
{
cmd.CommandText =
@"IF NOT EXISTS (SELECT 1 FROM dbo.Actor WHERE DelPri = @DelPri AND CustPrg3 = @CustPrg3)
INSERT INTO dbo.Actor(ActNo, CustNo, DelPri, CustPrg3, Nm, Gr6, CreDt, CreUsr)
VALUES(@ActNo, @CustNo, @DelPri, @CustPrg3, @Nm, @Gr6, @CreDt, @CreUsr);";
ActNoParam.Value = customers[i].ActNo; // <<< THIS IS WHERE YOUR NUMERIC VALUE GOES.
CustNoParam.Value = customers[i].CustNo; // <<< THIS IS WH ERE YOUR NUMERIC VALUE GOES.
DelpriParam.Value = Int32.Parse(customers[i].DelPri); // <<< THIS IS WHERE YOUR NUMERIC VALUE GOES.
CustPrg3Param.Value = customers[i].CustPrg3; // <<< THIS IS WHERE YOUR NUMERIC VALUE GOES.
NmParam.Value = customers[i].Nm; // <<< THIS IS WHERE YOUR NUMERIC VALUE GOES.
Gr6Param.Value = customers[i].Gr6; // <<< THIS IS WHERE YOUR NUMERIC VALUE GOES.
CreDtParam.Value = customers[i].CreDt; // <<< THIS IS WHERE YOUR NUMERIC VALUE GOES.
CreUsrParam.Value = customers[i].CreUsr; // <<< THIS IS WHERE YOUR NUMERIC VALUE GOES.
cmd.ExecuteNonQuery();
}
我知道第一个对象被传递给 class,我已经尝试在循环中打印出当前对象的值,所以数据在那里,但在插入时被跳过。
此外,我很确定这不是因为 if not exists 查询,因为我只检查了 12 位客户,我 运行 他们过来发现任何冲突。
我到底做错了什么?
感谢任何帮助! :)
您正在从索引 1 开始 for 循环,而 c# 是一种索引为 0 的语言。这意味着您实际上是从第二条记录开始的。
将您的 for 循环更改为:
for (int i = 0; i < customers.Count; i++)
你能try/confirm这些东西吗:
table演员有记录吗?是否有可能第一条记录已经存在于 table 中(即具有 Delpri 和 Custprg3 值)?
正如您所说的,这不是因为 IF NOT EXIST
,您可以通过删除它来尝试 运行 吗?
您的 for 循环以 i = 1
开头。您确定顺序正确吗?
我正在从另一个 class 获取对象列表,并在我的插入查询中使用它。
不知怎的,我遇到了一个奇怪的问题 "error",因为列表中的第一个对象没有插入。
如果有人能发现我的错误,我将非常高兴!我的头一直在敲键盘有一段时间了...
var ActNoParam = new SqlParameter();
ActNoParam.ParameterName = "@ActNo";
ActNoParam.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(ActNoParam);
var CustNoParam = new SqlParameter();
CustNoParam.ParameterName = "@CustNo";
CustNoParam.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(CustNoParam);
var DelpriParam = new SqlParameter();
DelpriParam.ParameterName = "@DelPri";
DelpriParam.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(DelpriParam);
var CustPrg3Param = new SqlParameter();
CustPrg3Param.ParameterName = "@CustPrg3";
CustPrg3Param.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(CustPrg3Param);
var NmParam = new SqlParameter();
NmParam.ParameterName = "@Nm";
NmParam.SqlDbType = SqlDbType.VarChar;
cmd.Parameters.Add(NmParam);
var Gr6Param = new SqlParameter();
Gr6Param.ParameterName = "@Gr6";
Gr6Param.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(Gr6Param);
var CreUsrParam = new SqlParameter();
CreUsrParam.ParameterName = "@CreUsr";
CreUsrParam.SqlDbType = SqlDbType.VarChar;
cmd.Parameters.Add(CreUsrParam);
var CreDtParam = new SqlParameter();
CreDtParam.ParameterName = "@CreDt";
CreDtParam.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(CreDtParam);
for (int i = 1; i < customers.Count; i++)
{
cmd.CommandText =
@"IF NOT EXISTS (SELECT 1 FROM dbo.Actor WHERE DelPri = @DelPri AND CustPrg3 = @CustPrg3)
INSERT INTO dbo.Actor(ActNo, CustNo, DelPri, CustPrg3, Nm, Gr6, CreDt, CreUsr)
VALUES(@ActNo, @CustNo, @DelPri, @CustPrg3, @Nm, @Gr6, @CreDt, @CreUsr);";
ActNoParam.Value = customers[i].ActNo; // <<< THIS IS WHERE YOUR NUMERIC VALUE GOES.
CustNoParam.Value = customers[i].CustNo; // <<< THIS IS WH ERE YOUR NUMERIC VALUE GOES.
DelpriParam.Value = Int32.Parse(customers[i].DelPri); // <<< THIS IS WHERE YOUR NUMERIC VALUE GOES.
CustPrg3Param.Value = customers[i].CustPrg3; // <<< THIS IS WHERE YOUR NUMERIC VALUE GOES.
NmParam.Value = customers[i].Nm; // <<< THIS IS WHERE YOUR NUMERIC VALUE GOES.
Gr6Param.Value = customers[i].Gr6; // <<< THIS IS WHERE YOUR NUMERIC VALUE GOES.
CreDtParam.Value = customers[i].CreDt; // <<< THIS IS WHERE YOUR NUMERIC VALUE GOES.
CreUsrParam.Value = customers[i].CreUsr; // <<< THIS IS WHERE YOUR NUMERIC VALUE GOES.
cmd.ExecuteNonQuery();
}
我知道第一个对象被传递给 class,我已经尝试在循环中打印出当前对象的值,所以数据在那里,但在插入时被跳过。
此外,我很确定这不是因为 if not exists 查询,因为我只检查了 12 位客户,我 运行 他们过来发现任何冲突。
我到底做错了什么?
感谢任何帮助! :)
您正在从索引 1 开始 for 循环,而 c# 是一种索引为 0 的语言。这意味着您实际上是从第二条记录开始的。
将您的 for 循环更改为:
for (int i = 0; i < customers.Count; i++)
你能try/confirm这些东西吗:
table演员有记录吗?是否有可能第一条记录已经存在于 table 中(即具有 Delpri 和 Custprg3 值)?
正如您所说的,这不是因为
IF NOT EXIST
,您可以通过删除它来尝试 运行 吗?您的 for 循环以
i = 1
开头。您确定顺序正确吗?