哪位大哥帮我看看这段存储程序,我把分全给了。。。谢谢了
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // 打开ACESS文件读取数据到表格
FromFile="";
OpenDialog1->InitialDir=GetCurrentDir();
OpenDialog1->Title="选择Access表格文件";
OpenDialog1->Filter ="Access files (*.mdb) | *.mdb";
if (OpenDialog1->Execute())
FromFile=OpenDialog1->FileName;
if(ExtractFileName(FromFile).IsEmpty()) return;
if(!FileExists(FromFile))
{
MessageBox(0, "设定ACCESS表格文件无法连接!", "提示", MB_OK|MB_ICONWARNING);
return;
}
Edit1->Text = FromFile; // 这个edit控件显示一个文件路径
AnsiString ID;
float V1,V2;
int U1,U2,D1,D2,K0,K;
int iLine = 1; // StringGrid1->RowCount;
StringGrid1->RowCount = 2; // 设置这个StringGrid 控件的行数为2
ADOQuery1->Close(); // 关闭之前的ADOQuery1(如果之前有open)
ADOQuery1->SQL->Clear(); // 清除之前这个ADOQuery1的sql语句(如果有)
ADOQuery1->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+FromFile; //数据库连接字符串,可以看出要连接的是个access数据库
AnsiString sql = "select * from IRData order by K0"; //填写sql语句,从IRData这个表中查询所有记录,结果集按 KO 字段来排序
ADOQuery1->SQL->Add(sql); //把上面这个sql语句赋给ADOQuery1.sql属性
try // try ...catch 块包裹代码以便捕获异常信息
{
ADOQuery1->Open(); // 连接打开数据库提交sql查询
}
catch(...) // 上面的open操作如果发生错误或异常就执行下面的代码
{
ADOQuery1->Close(); // 关闭对数据库的连接
ShowMessage("ACCESS表格文件无法连接!"); // 关闭对数据库的连接
return; //retrun返回,即退出这个函数不再往下执行
}
// 如果上面代码执行没有进入catch(...) {} 中的代码,以下的代码才可能得到执行
// 判断这个ADOQuery查询结果,如果返回的数据集不是空
if(!ADOQuery1->IsEmpty()) // IsEmpty返回一个bool值,表示是否为空
{
ADOQuery1->FindFirst(); // FindFirst函数找出返回的数据集中的第一条记录
do
{
// 把表中查询到的 ID 字段的值用AsString函数转为字符串 赋值给 AnsiString ID;
// 如果字符串首位两侧有空格字符,用Trim函数去掉两侧空格字符
ID = Trim(ADOQuery1->FieldByName("ID")->AsString); //ShowMessage(ID);
if(!ID.IsEmpty())
{
V1 = ADOQuery1->FieldByName("V1")->AsFloat;
V2 = ADOQuery1->FieldByName("V2")->AsFloat;
U1 = ADOQuery1->FieldByName("U1")->AsInteger;
U2 = ADOQuery1->FieldByName("U2")->AsInteger;
D1 = ADOQuery1->FieldByName("D1")->AsInteger;
D2 = ADOQuery1->FieldByName("D2")->AsInteger;
K0 = ADOQuery1->FieldByName("K0")->AsInteger;
K = ADOQuery1->FieldByName("K") ->AsInteger;
StringGrid1->Cells[0][iLine] = IntToStr(iLine);
StringGrid1->Cells[1][iLine] = ID;
StringGrid1->Cells[2][iLine] = FloatToStr( ((long)( V1 *10))/10.0 ); // 保留1位小数
StringGrid1->Cells[3][iLine] = FloatToStr( ((long)( V2 *10))/10.0 ); // 保留1位小数
StringGrid1->Cells[4][iLine] = IntToStr( U1 );
StringGrid1->Cells[5][iLine] = IntToStr( U2 );
StringGrid1->Cells[6][iLine] = IntToStr( D1 );
StringGrid1->Cells[7][iLine] = IntToStr( D2 );
StringGrid1->Cells[8][iLine] = IntToStr( K0 );
StringGrid1->Cells[9][iLine] = IntToStr( K );
StringGrid1->RowCount +=1;
StringGrid1->Row = iLine++;
}
}while(ADOQuery1->FindNext() && iLine<=28);
}
ADOQuery1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{ // 保存表格到ACESS数据库
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+FromFile;
AnsiString sql = "select * from IRData order by ID";
ADOQuery1->SQL->Add(sql);
try
{
ADOQuery1->Open();
}
catch(...)
{
ADOQuery1->Close();
ShowMessage("ERROR...ACCESS表格文件无法连接!");
return;
}
int iLine = StringGrid1->RowCount;
if(iLine<=2)
{
ADOQuery1->Close();
ShowMessage("ERROR...缺少表格数据!");
return;
}
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("delete from IRData");
ADOQuery1->ExecSQL(); // 删除IRData表中原数据, 准备写入以下新数据。。。
for(iLine=1; iLine<StringGrid1->RowCount; iLine++)
{
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("INSERT INTO IRData(ID, V1, V2, U1, U2, D1, D2, K0,K)");
ADOQuery1->SQL->Add(" VALUES(:IDV,:V1V,:V2V,:U1V,:U2V,:D1V,:D2V,:K0V,:KV)");
ADOQuery1->Parameters->ParamByName("IDV")->Value = StringGrid1->Cells[1][iLine] ;
ADOQuery1->Parameters->ParamByName("V1V")->Value = StrToFloatDef(StringGrid1->Cells[2][iLine], 0);
ADOQuery1->Parameters->ParamByName("V2V")->Value = StrToFloatDef(StringGrid1->Cells[3][iLine], 0);
ADOQuery1->Parameters->ParamByName("U1V")->Value = StrToIntDef(StringGrid1->Cells[4][iLine], 0);
ADOQuery1->Parameters->ParamByName("U2V")->Value = StrToIntDef(StringGrid1->Cells[5][iLine], 0);
ADOQuery1->Parameters->ParamByName("D1V")->Value = StrToIntDef(StringGrid1->Cells[6][iLine], 0);
ADOQuery1->Parameters->ParamByName("D2V")->Value = StrToIntDef(StringGrid1->Cells[7][iLine], 0);
ADOQuery1->Parameters->ParamByName("K0V")->Value = StrToIntDef(StringGrid1->Cells[8][iLine], 0);
ADOQuery1->Parameters->ParamByName("KV")->Value = StrToIntDef(StringGrid1->Cells[9][iLine], 0);
ADOQuery1->ExecSQL();
}
ADOQuery1->Close();
ShowMessage("ACCESS表格数据成功保存!");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnSelectCelLx(TObject *Sender, int ACol, int ARow,
bool &CanSelect)
{ // 设置某些列不可修改(只允许修改最后2列即"新定义按钮"和"绘图选项")
if(ACol==9||ACol==10)
StringGrid1->Options<<goEditing;
else
StringGrid1->Options>>goEditing;
}
[解决办法]
这么高的分,必须回复:
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // 打开ACESS文件读取数据到表格
String FromFile=""; // 声明一个字符串变量,用于存储用户选择的Access数据库文件的全路径
OpenDialog1->InitialDir=GetCurrentDir(); // 设置文件选择对话框OpenDialog的默认目录为当前目录,这里不建议使用GetCurrentDir取得当前目录
OpenDialog1->Title="选择Access表格文件"; // 设置了文件选择对话框OpenDialog的标题
OpenDialog1->Filter ="Access files (*.mdb)
[解决办法]
*.mdb"; // 文件选择对话框OpenDialog显示的文件类型
if (OpenDialog1->Execute()) // 如果用户使用了文件选择对话框OpenDialog
FromFile=OpenDialog1->FileName; // 将文件全路径赋给变量
if(ExtractFileName(FromFile).IsEmpty()) return; // 判断可执行文件名为空则返回,此处用的怪异不推荐
if(!FileExists(FromFile)) // 判断数据库文件是否存在
{
MessageBox(0, "设定ACCESS表格文件无法连接!", "提示", MB_OK
[解决办法]
MB_ICONWARNING);
return;
}
Edit1->Text = FromFile; // 这个edit控件显示一个文件路径
AnsiString ID;
float V1,V2;
int U1,U2,D1,D2,K0,K;
int iLine = 1; // StringGrid1->RowCount;
StringGrid1->RowCount = 2; // 设置这个StringGrid 控件的行数为2
ADOQuery1->Close(); // 关闭之前的ADOQuery1(如果之前有open)
ADOQuery1->SQL->Clear(); // 清除之前这个ADOQuery1的sql语句(如果有)
ADOQuery1->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+FromFile; //数据库连接字符串,可以看出要连接的是个access数据库
AnsiString sql = "select * from IRData order by K0"; //填写sql语句,从IRData这个表中查询所有记录,结果集按 KO 字段来排序
ADOQuery1->SQL->Add(sql); //把上面这个sql语句赋给ADOQuery1.sql属性
try // try ...catch 块包裹代码以便捕获异常信息
{
ADOQuery1->Open(); // 连接打开数据库提交sql查询
}
catch(...) // 上面的open操作如果发生错误或异常就执行下面的代码
{
ADOQuery1->Close(); // 关闭对数据库的连接
ShowMessage("ACCESS表格文件无法连接!"); // 关闭对数据库的连接
return; //retrun返回,即退出这个函数不再往下执行
}
// 如果上面代码执行没有进入catch(...) {} 中的代码,以下的代码才可能得到执行
// 判断这个ADOQuery查询结果,如果返回的数据集不是空
if(!ADOQuery1->IsEmpty()) // IsEmpty返回一个bool值,表示是否为空
{
ADOQuery1->FindFirst(); // FindFirst函数找出返回的数据集中的第一条记录
do
{
// 把表中查询到的 ID 字段的值用AsString函数转为字符串 赋值给 AnsiString ID;
// 如果字符串首位两侧有空格字符,用Trim函数去掉两侧空格字符
ID = Trim(ADOQuery1->FieldByName("ID")->AsString); //ShowMessage(ID);
if(!ID.IsEmpty()) // 如果ID这个字符串不为空
{
V1 = ADOQuery1->FieldByName("V1")->AsFloat; // 将查询到的指定列数据赋值给变量,下同
V2 = ADOQuery1->FieldByName("V2")->AsFloat;
U1 = ADOQuery1->FieldByName("U1")->AsInteger;
U2 = ADOQuery1->FieldByName("U2")->AsInteger;
D1 = ADOQuery1->FieldByName("D1")->AsInteger;
D2 = ADOQuery1->FieldByName("D2")->AsInteger;
K0 = ADOQuery1->FieldByName("K0")->AsInteger;
K = ADOQuery1->FieldByName("K") ->AsInteger;
StringGrid1->Cells[0][iLine] = IntToStr(iLine); // 将上面的结果填充到StringGrid控件的iLine行用于显示,下同
StringGrid1->Cells[1][iLine] = ID;
StringGrid1->Cells[2][iLine] = FloatToStr( ((long)( V1 *10))/10.0 ); // 保留1位小数
StringGrid1->Cells[3][iLine] = FloatToStr( ((long)( V2 *10))/10.0 ); // 保留1位小数
StringGrid1->Cells[4][iLine] = IntToStr( U1 );
StringGrid1->Cells[5][iLine] = IntToStr( U2 );
StringGrid1->Cells[6][iLine] = IntToStr( D1 );
StringGrid1->Cells[7][iLine] = IntToStr( D2 );
StringGrid1->Cells[8][iLine] = IntToStr( K0 );
StringGrid1->Cells[9][iLine] = IntToStr( K );
StringGrid1->RowCount +=1; // 总行数加1
StringGrid1->Row = iLine++; // 选中行加1
}
}while(ADOQuery1->FindNext() && iLine<=28); // 循环条件是有下一条记录,同时行数<=28
}
ADOQuery1->Close(); // 关闭数据库查询控件
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{ // 保存表格到ACESS数据库
ADOQuery1->Close(); // 先关闭数据库查询控件
ADOQuery1->SQL->Clear(); // 清空
ADOQuery1->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+FromFile; // 设置数据库连接串
AnsiString sql = "select * from IRData order by ID"; // 设置SQL语句
ADOQuery1->SQL->Add(sql); // 载入SQL语句
try
{
ADOQuery1->Open(); // 执行查询
}
catch(...)
{
ADOQuery1->Close();
ShowMessage("ERROR...ACCESS表格文件无法连接!");
return;
}
int iLine = StringGrid1->RowCount; // 取得总行数
if(iLine<=2)
{
ADOQuery1->Close();
ShowMessage("ERROR...缺少表格数据!");
return;
}
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("delete from IRData"); // 设置清空表
ADOQuery1->ExecSQL(); // 删除IRData表中原数据, 准备写入以下新数据。。。
for(iLine=1; iLine<StringGrid1->RowCount; iLine++)
{
// 此处用参数法逐行将StringGrid控件中的行内容插入数据库
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("INSERT INTO IRData(ID, V1, V2, U1, U2, D1, D2, K0,K)");
ADOQuery1->SQL->Add(" VALUES(:IDV,:V1V,:V2V,:U1V,:U2V,:D1V,:D2V,:K0V,:KV)");
ADOQuery1->Parameters->ParamByName("IDV")->Value = StringGrid1->Cells[1][iLine] ;
ADOQuery1->Parameters->ParamByName("V1V")->Value = StrToFloatDef(StringGrid1->Cells[2][iLine], 0);
ADOQuery1->Parameters->ParamByName("V2V")->Value = StrToFloatDef(StringGrid1->Cells[3][iLine], 0);
ADOQuery1->Parameters->ParamByName("U1V")->Value = StrToIntDef(StringGrid1->Cells[4][iLine], 0);
ADOQuery1->Parameters->ParamByName("U2V")->Value = StrToIntDef(StringGrid1->Cells[5][iLine], 0);
ADOQuery1->Parameters->ParamByName("D1V")->Value = StrToIntDef(StringGrid1->Cells[6][iLine], 0);
ADOQuery1->Parameters->ParamByName("D2V")->Value = StrToIntDef(StringGrid1->Cells[7][iLine], 0);
ADOQuery1->Parameters->ParamByName("K0V")->Value = StrToIntDef(StringGrid1->Cells[8][iLine], 0);
ADOQuery1->Parameters->ParamByName("KV")->Value = StrToIntDef(StringGrid1->Cells[9][iLine], 0);
ADOQuery1->ExecSQL();
}
ADOQuery1->Close();
ShowMessage("ACCESS表格数据成功保存!");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnSelectCelLx(TObject *Sender, int ACol, int ARow,
bool &CanSelect)
{ // 设置某些列不可修改(只允许修改最后2列即"新定义按钮"和"绘图选项")
if(ACol==9
[解决办法]
ACol==10)
StringGrid1->Options<<goEditing; // 设置第9和第10列允许编辑行文本
else
StringGrid1->Options>>goEditing;
}