新手学习c#操作access

大風起兮 2015-05-07 10:48:49
照着网上的例子做了一个
1。创建mdb文件
2。为mdb文件创建表table
3。往table里面添加字段
4。往table里面添加数据

但打开生成的mdb文件,最后发现,第一行的数据总是不显示如下图





而正常完全显示应该是下图:



我单步调试,生成的能显示完全。
我就在里面加了个sleep(1000),发现也可以生成的能显示完全

并且只能将sleep加在下面这段代码的前后才管用:
//建立连接
string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=sec.mdb";
OleDbConnection odcConnection = new OleDbConnection(strConn);
odcConnection.Open();



求解答啊,新手,大神们不要笑话。该怎么改,弄了一晚上了。

具体代码如下:



//第一步:创建数据库文件

//1.创建一个数据库 catalog
ADOX.Catalog catalog = new Catalog();
catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=sec.mdb;Jet OLEDB:Engine Type=5");



//第二步:创建表格并为表格添加字段

//1.为数据库 catalog 创建一张表table

ADOX.TableClass table = new ADOX.TableClass();
table.ParentCatalog = catalog; //属于catalog
table.Name = "systemTable";

//2.为table创建列 Columns(StuID,StuName,Stuage)

//(1)第一列 :StuID

ADOX.ColumnClass col00 = new ADOX.ColumnClass();
col00.ParentCatalog = catalog; //属于catalog
col00.Type = ADOX.DataTypeEnum.adInteger; //数据类型为正整型
col00.Name = "StuID"; //第一列为 StuID
col00.Properties["Jet OLEDB:Allow Zero Length"].Value = false; //允许0长度
col00.Properties["AutoIncrement"].Value = true; //不允许自动增长

//(2)第二列:StuName
ADOX.ColumnClass col01 = new ADOX.ColumnClass();
col01.ParentCatalog = catalog;
col01.Type = ADOX.DataTypeEnum.adLongVarWChar;
col01.Name = "StuName"; //第二列为 StuName
col01.Properties["Jet OLEDB:Allow Zero Length"].Value = false;
col01.Properties["AutoIncrement"].Value = false; //(默认值)


//(2)第三列:Stuage
ADOX.ColumnClass col02 = new ADOX.ColumnClass();
col02.ParentCatalog = catalog;
col02.Name = "Stuage";
col02.Type = ADOX.DataTypeEnum.adDouble;
col02.Properties["Jet OLEDB:Allow Zero Length"].Value = false;


//4.将Columns添加到table
table.Keys.Append("PrimaryKey", ADOX.KeyTypeEnum.adKeyPrimary, "StuID", "", "");
table.Columns.Append(col00, ADOX.DataTypeEnum.adInteger, 0);
table.Columns.Append(col01, ADOX.DataTypeEnum.adLongVarWChar, 25);
table.Columns.Append(col02, ADOX.DataTypeEnum.adDouble, 666);


//5.将table添加到catalog
catalog.Tables.Append(table);


//第三步:为表格添加具体数据

//为三个字段添加内容

//建立连接
string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=sec.mdb";
OleDbConnection odcConnection = new OleDbConnection(strConn);

odcConnection.Open();

Thread.Sleep(1000);

string sql01 = "insert into systemTable" + @" (StuName,Stuage) values" + @"('hu',11)";
OleDbCommand odCommand01 = new OleDbCommand(sql01, odcConnection);
odCommand01.ExecuteNonQuery();



string sql02 = "insert into systemTable" + @" (StuName,Stuage) values" + @"('sum',13)";
OleDbCommand odCommand02 = new OleDbCommand(sql02, odcConnection);
odCommand02.ExecuteNonQuery();

string sql03 = "insert into systemTable" + @" (StuName,Stuage) values" + @"('jam',14)";
OleDbCommand odCommand03 = new OleDbCommand(sql03, odcConnection);
odCommand03.ExecuteNonQuery();

//4.关闭连接
odcConnection.Close();

//5.释放COM对象
System.Runtime.InteropServices.Marshal.ReleaseComObject(table);
System.Runtime.InteropServices.Marshal.ReleaseComObject(catalog);
table = null;
catalog = null;
GC.WaitForPendingFinalizers();
GC.Collect();

...全文
304 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
大風起兮 2015-05-08
  • 打赏
  • 举报
回复
引用 1 楼 lovelj2012 的回复:
肉眼看不出原因! 这样,你在执行ExecuteNonQuery方法的时候,看影响行数是否为1,如果三条插入语句执行后影响行数都是1,说明是插入进去的。至于查看不到第一条,是另外的原因(我们再做分析)。先验证下上面的推论。

int result = odCommand01.ExecuteNonQuery();
if(result == 0)
{
//插入失败
}
谢谢! 1。按照您的方法,我试了下,没有插入失败; 2。但在我下面的实验中,我先执行一遍上面的代码,生成mdb文件,并不手动打开这个mdb文件,而是用下面的方法去取这张表格显示在控件dataGridView上,发现居然能显示完整,并且我再去手工打开mdb文件的时候,发现也完整了。 但,如果我先手工打开mdb文件,再用下面的代码来这张表格显示在控件dataGridView上,就显示不完整了。这是个什么鬼?? DataSet mydas; int vRec; string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=sec.mdb"; OleDbConnection odcConnection = new OleDbConnection(strConn); odcConnection.Open(); string sql09 = "select * from systemTable"; OleDbDataAdapter myda = new OleDbDataAdapter(sql09, odcConnection); DataSet mydas = new System.Data.DataSet(); vRec = myda.Fill(mydas,"systemTable"); dataGridView1.DataSource = mydas.Tables["systemTable"]; odcConnection.Close();
江南小鱼 2015-05-08
  • 打赏
  • 举报
回复
肉眼看不出原因! 这样,你在执行ExecuteNonQuery方法的时候,看影响行数是否为1,如果三条插入语句执行后影响行数都是1,说明是插入进去的。至于查看不到第一条,是另外的原因(我们再做分析)。先验证下上面的推论。

int result = odCommand01.ExecuteNonQuery();
if(result == 0)
{
//插入失败
}
大風起兮 2015-05-08
  • 打赏
  • 举报
回复
引用 6 楼 zwbdabc 的回复:
代码没问题,可能是mdb文件修改后又被覆盖了
谢谢!
大風起兮 2015-05-08
  • 打赏
  • 举报
回复
引用 5 楼 lovelj2012 的回复:
如果我先手工打开mdb文件,再用下面的代码来这张表格显示在控件dataGridView上,就显示不完整了
这么看,跟代码没什么关系了,估计是access的什么特性或者其神马原因吧。
谢谢!
zwbdabc 2015-05-08
  • 打赏
  • 举报
回复
代码没问题,可能是mdb文件修改后又被覆盖了
江南小鱼 2015-05-08
  • 打赏
  • 举报
回复
如果我先手工打开mdb文件,再用下面的代码来这张表格显示在控件dataGridView上,就显示不完整了
这么看,跟代码没什么关系了,估计是access的什么特性或者其神马原因吧。
大風起兮 2015-05-08
  • 打赏
  • 举报
回复
引用 3 楼 lovelj2012 的回复:
[quote=引用 2 楼 u014696628 的回复:] 谢谢! 1。按照您的方法,我试了下,没有插入失败; 2。但在我下面的实验中,我先执行一遍上面的代码,生成mdb文件,并不手动打开这个mdb文件,而是用下面的方法去取这张表格显示在控件dataGridView上,发现居然能显示完整,并且我再去手工打开mdb文件的时候,发现也完整了。 但,如果我先手工打开mdb文件,再用下面的代码来这张表格显示在控件dataGridView上,就显示不完整了。这是个什么鬼?? DataSet mydas; int vRec; string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=sec.mdb"; OleDbConnection odcConnection = new OleDbConnection(strConn); odcConnection.Open(); string sql09 = "select * from systemTable"; OleDbDataAdapter myda = new OleDbDataAdapter(sql09, odcConnection); DataSet mydas = new System.Data.DataSet(); vRec = myda.Fill(mydas,"systemTable"); dataGridView1.DataSource = mydas.Tables["systemTable"]; odcConnection.Close();
执行select * from systemTable,返回的是两条?[/quote]
引用 3 楼 lovelj2012 的回复:
[quote=引用 2 楼 u014696628 的回复:] 谢谢! 1。按照您的方法,我试了下,没有插入失败; 2。但在我下面的实验中,我先执行一遍上面的代码,生成mdb文件,并不手动打开这个mdb文件,而是用下面的方法去取这张表格显示在控件dataGridView上,发现居然能显示完整,并且我再去手工打开mdb文件的时候,发现也完整了。 但,如果我先手工打开mdb文件,再用下面的代码来这张表格显示在控件dataGridView上,就显示不完整了。这是个什么鬼?? DataSet mydas; int vRec; string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=sec.mdb"; OleDbConnection odcConnection = new OleDbConnection(strConn); odcConnection.Open(); string sql09 = "select * from systemTable"; OleDbDataAdapter myda = new OleDbDataAdapter(sql09, odcConnection); DataSet mydas = new System.Data.DataSet(); vRec = myda.Fill(mydas,"systemTable"); dataGridView1.DataSource = mydas.Tables["systemTable"]; odcConnection.Close();
执行select * from systemTable,返回的是两条?[/quote] 用这段代码取出能显示是正常的三条数据
江南小鱼 2015-05-08
  • 打赏
  • 举报
回复
引用 2 楼 u014696628 的回复:
谢谢! 1。按照您的方法,我试了下,没有插入失败; 2。但在我下面的实验中,我先执行一遍上面的代码,生成mdb文件,并不手动打开这个mdb文件,而是用下面的方法去取这张表格显示在控件dataGridView上,发现居然能显示完整,并且我再去手工打开mdb文件的时候,发现也完整了。 但,如果我先手工打开mdb文件,再用下面的代码来这张表格显示在控件dataGridView上,就显示不完整了。这是个什么鬼?? DataSet mydas; int vRec; string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=sec.mdb"; OleDbConnection odcConnection = new OleDbConnection(strConn); odcConnection.Open(); string sql09 = "select * from systemTable"; OleDbDataAdapter myda = new OleDbDataAdapter(sql09, odcConnection); DataSet mydas = new System.Data.DataSet(); vRec = myda.Fill(mydas,"systemTable"); dataGridView1.DataSource = mydas.Tables["systemTable"]; odcConnection.Close();
执行select * from systemTable,返回的是两条?

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧