以上是我的基本测试数据库程序.
我来解说一下:
上面两个框是textbox1,2,是读取数据库的内容,在读取一条数据显示在1,2可,在1,2框修改值,再按SAVE键可修改数据库;Delete键是删除1,2框显示的那条数据;
下面是框3,4.从中输入新值,按ADD键可增加一条新数据;
以下是代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
namespace DataBase_Example
{
public partial class frmMain : Form
{
//连接ACCSEE数据库
OleDbConnection m_cn = new OleDbConnection();
OleDbDataAdapter m_ad;
OleDbCommandBuilder m_cb;
DataTable m_dt = new DataTable();
int m_row = 0;
public frmMain()
{
InitializeComponent();
}
private void frmMain_Load(object sender, EventArgs e)
{
m_cn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\text.mdb";
m_cn.Open();
m_ad = new OleDbDataAdapter("select * From dd", m_cn);
//??这句我不懂
m_cb = new OleDbCommandBuilder(m_ad);
m_ad.Fill(m_dt);
this.ShowCurrentRecord();
}
//关后解放内存
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
m_cn.Close();
m_cn.Dispose();
}
//这个叫类还是叫方法了?(-_-b)
private void ShowCurrentRecord()
{
if (m_dt.Rows.Count == 0)
{
textBox1.Text = "";
textBox2.Text = "";
return;
}
textBox1.Text =
m_dt.Rows[m_row]["name"].ToString();
textBox2.Text =
m_dt.Rows[m_row]["age"].ToString();
}
private void btnMoveFirst_Click(object sender, EventArgs e)
{
m_row = 0;
this.ShowCurrentRecord();
}
private void btnMoveNext_Click(object sender, EventArgs e)
{
if (m_row != 0)
{
m_row--;
this.ShowCurrentRecord();
}
}
private void btnMoveNext_Click_1(object sender, EventArgs e)
{
if (m_row < m_dt.Rows.Count - 1)
{
m_row++;
this.ShowCurrentRecord();
}
}
private void btnMoveLast_Click(object sender, EventArgs e)
{
if (m_dt.Rows.Count != 0)
{
m_row = m_dt.Rows.Count - 1;
this.ShowCurrentRecord();
}
}
private void btnSave_Click(object sender, EventArgs e)
{
if (m_dt.Rows.Count != 0)
{
m_dt.Rows[m_row]["name"] = textBox1.Text;
m_dt.Rows[m_row]["age"] = Convert.ToInt32(textBox2.Text);
m_ad.Update(m_dt);
m_dt.AcceptChanges();
}
}
private void btnAdd_Click(object sender, EventArgs e)
{
DataRow drN = m_dt.NewRow();
drN["name"] = textBox3.Text;
drN["age"] = Convert.ToInt32(textBox4.Text);
//写入datatable
m_dt.Rows.Add(drN);
m_ad.Update(m_dt);
m_dt.AcceptChanges();
m_row = m_dt.Rows.Count - 1;
this.ShowCurrentRecord();
}
private void btnDelete_Click(object sender, EventArgs e)
{
if (m_dt.Rows.Count != 0)
{
m_dt.Rows[m_row].Delete();
m_ad.Update(m_dt);
m_dt.AcceptChanges();
m_row = 0;
this.ShowCurrentRecord();
}
}
}
}
以上!问题是这样:
1,按Add键:数据库中加入一条数据txt1.text和txt2.text (OK)
2,按Delete:删除一条数据,以m_row为索引 (OK)
3,先按Add,加了一条新数据,再按Delete(出异常)
4, 先按Add,在textbox1,2改改值,再按Save(出异常)
异常为:违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条。
..所以。。请教?
另外:是关于C#Winform打包的问题.
大家都知道目前绝大部分WINDOWS是NO~~.net库的(不知道Vista怎么样).所以我们打包程序非得把.net也包进去(那个郁闷我就不说了,目前也没啥好办法.谁叫咱是学C#的呢,只好坚挺地上了,兄弟们说是不?)."天使不哭"大大的那篇文章我看了,在这先感谢一下!不过我听说用那种方法打包的话,可以是可以,不过客户安装的时候会问"要不要装.net?"这句白痴话(听说的!听说!不要BS我),这样就不太好了对吧.
有什么方法可以在测到客户机没有.net的情况下,神不知鬼不觉地把.net坚挺进去?
所以我看上了installshield这个第三方软件..
问题来了:俺不会用.
听说要把.net装上去还要编个代码..俺也不会..
各位C#的兄弟姐妹,谁有这个经验的手把手教我一下?(网上也有很多我这样的小可怜在问这问题.可大部分回答的人都是五行欠扁.废话一堆,关键的泡泡没冒出一个,心那个寒哇~)
祝各位:男的日日坚挺!女的日日放电!以上!