我在数据表上做了一些工作,我用一个由访问数据库制作的oledbdataadapter。我偶然发现了这个错误:
原来我的表有这样的结构: ID - >自动编号(PK)
lazos_>文字
Asociaciones->文字
当我填充我的数据表时,所有值都传递给它,所有正确的值都没有任何问题。我插入一个新行,如“插入行”部分所示。
我这样做,因为我的pk会在行创建时检查“autonumber”,但显然它没有这样做,因为当我循环行时,我得到一个“无效的强制转换异常”,而对象无法从DBNull强制转换其他类型。“
我可以在列中插入一个id值,但是当我将我的dt更新到我的数据库时,它不会创建错误,因为我无法知道最后一行是创建的吗?还是我?
例如,让我说在我的数据表中最后一个ID是50,但是在数据库y之前创建了一个id为“51”的记录,但随后将其删除,如果我根据我的dt信息插入51,则会出错正确? //// INSERT ROW
DataRow newRow = Tabla_Cods_Proy.NewRow();
newRow["Lazos"] = textBox1.Text ;
newRow["Asociaciones"] = textBox2.Text;
Tabla_Cods_Proy.Rows.Add(newRow);
MessageBox.Show("Enhorabuena!");
//CHECK ID's
for (int i = 0; i < Tabla_Cods_Proy.Rows.Count; i++)
{
if (Tabla_Cods_Proy.Rows[i].RowState != DataRowState.Deleted)
{
if (Tabla_Cods_Proy.Rows[i]["Lazos_asociados"].ToString() == "")
{
listBox7.Items.Add(Tabla_Cods_Proy.Rows[i]["Cod_Cliente"]);
listBox8.Items.Add(Tabla_Cods_Proy.Rows[i]["Cod_Inelectra"]);
ID_Cods_Proy_Sin_Asociar.Add(Convert.ToInt32(Tabla_Cods_Proy.Rows[i]["ID"]));
}
else
{
listBox3.Items.Add(Tabla_Cods_Proy.Rows[i]["Cod_Cliente"]);
listBox4.Items.Add(Tabla_Cods_Proy.Rows[i]["Cod_Inelectra"]);
ID_Cods_Proy_Asociados.Add(Convert.ToInt32(Tabla_Cods_Proy.Rows[i]["ID"]));
}
}
答案 0 :(得分:0)
我曾经遇到过类似的问题。您需要做的是,在您将其插入表格后检索此列的新标识@@IDENTITY
。您可以使用RowUpdated
事件来完成此操作。
以下是MSDN page的快速示例(与您的情况相似,请参见本页底部):
public static void Main()
{
//...connecting to access db and getting data to datatable...
// ...
// Adding a new row to datatable.
DataRow newRow = catDS.Tables["Categories"].NewRow();
newRow["CategoryName"] = "New Category";
catDS.Tables["Categories"].Rows.Add(newRow);
// Include an event to fill in the Autonumber value.
catDA.RowUpdated += new OleDbRowUpdatedEventHandler(OnRowUpdated);
}
protected static void OnRowUpdated(object sender, OleDbRowUpdatedEventArgs args)
{
// Include a variable and a command to retrieve the identity value from the Access database.
int newID = 0;
OleDbCommand idCMD = new OleDbCommand("SELECT @@IDENTITY", nwindConn);
if (args.StatementType == StatementType.Insert)
{
// Retrieve the identity value and store it in the CategoryID column.
newID = (int)idCMD.ExecuteScalar();
args.Row["CategoryID"] = newID;
}
}