下面是我保存记录时的一段代码,注意,update不支持多表联合查询结果,你可以参照我的处理方法,MyTools.DoSql是另外一个函数,目的是执行一条SQL命令.
/// <summary>
/// 保存或增加一条记录
/// </summary>
/// <param name="p_DataRow">待保存的数据行</param>
/// <param name="p_TableName">数据表名称</param>
/// <param name="p_KeyField">主键字段</param>
/// <returns></returns>
public static bool SaveRecord(DataRow p_DataRow,string p_TableName,string p_KeyField)
{
bool bResult=true;
//数据库操作命令
string strSql="";
//如果是新记录(主键为-1,则先插入一条空记录
if(p_DataRow[p_KeyField].ToString()=="-1")
{
int nIndex=MyTools.GetNextKeyValue(p_TableName,p_KeyField);
p_DataRow[p_KeyField]=nIndex.ToString();
strSql=string.Format("Insert into {0} ({1}) values({2})",p_TableName,p_KeyField,nIndex);
MyTools.DoSql(strSql);
} //从数据库中得到当前记录信息
DataSet dataset=new DataSet();
strSql=string.Format("select  * from {0} where {1}={2}",
p_TableName,p_KeyField,p_DataRow[p_KeyField].ToString()); SqlCommand myCommand=new SqlCommand(strSql,m_Connect);
SqlDataAdapter myDataAdapter=new SqlDataAdapter();
SqlCommandBuilder myCommandBuilder=new SqlCommandBuilder(myDataAdapter);
myDataAdapter.SelectCommand=myCommand;
myDataAdapter.TableMappings.Add("Table",p_TableName);
myDataAdapter.Fill(dataset); //找到当前记录
if(dataset.Tables[p_TableName].Rows.Count==1)
{
DataRow row=dataset.Tables[p_TableName].Rows[0];
string strFieldName;
//给字段赋值
foreach(System.Data.DataColumn col in dataset.Tables[p_TableName].Columns)
{
try
{
strFieldName=col.Caption;
if(p_DataRow[strFieldName]==DBNull.Value)//空值
{
row[strFieldName]=DBNull.Value;
}
else if(col.DataType==typeof(System.Byte[]))//照片字段
{
Byte[] byteBLOBData =  new Byte[0];
byteBLOBData = (Byte[])p_DataRow[strFieldName];
row[strFieldName]=byteBLOBData;
}
else//其他字段
{
row[col.Caption]=p_DataRow[strFieldName].ToString();
}
}
catch
{
}
}//foreach
//开始更新
try
{
myDataAdapter.Update(dataset,p_TableName);
}
catch(Exception ee)
{
MessageBox.Show(ee.Message);
bResult=false;
}
}
else
{
MessageBox.Show("记录数出错,存盘失败");
bResult=false;
}
return bResult;
}