技术开发 频道

.NET数据访问架构设计和实现


        在这里只是给出了基本的操作,也许大家会问怎么还没有自动生成我们的SQL语句,别急在介绍下面的两个类前现给大家讲点小知识。先从“视图”菜单中打开“服务器资源管理器”然后把你需要的数据库连接上,然后在我们的项目上添加个数据集把我们需要的表从服务器资源管理器中连接的数据库中直接拖放到数据集就可以了。

        到现在大家也能猜的到我用什么来自动生成SQL语句了吧!
        对,就是用这个定义好的DATASET,它里面已经包含了我们需要的数据库中表的信息,当我们定义DT的时候取DATASET里面表的类型就可以了.而我门只需要做的就是来控制DT然后由下面三个类中的方法负责生成相应的SQL语句:

public class InsertCommand : OperatorDB
    {
        public static int ExecuteInsert(System.Data.DataTable dt, int index)
        {
            string InsetCommandText;
            SqlCommand InsertSqlCom;
            int ID;
            InsertSqlCom = new SqlCommand();
            InsetCommandText = GetInsertCommandText(dt);
            InsertSqlCom.CommandText = InsetCommandText;
            SetSqlCommandValues(InsertSqlCom,dt,index,1);
            ID = ExecuteSql(InsertSqlCom);
            return ID;
        }
        public static int ExecuteInsert(System.Data.DataTable dt)
        {
            string InsetCommandText;
            SqlCommand InsertSqlCom;
            int ID =0;
            InsetCommandText = GetInsertCommandText(dt);
            int i;
            for ( i = 0 ;i < dt.Rows.Count;i++)
            {
                InsertSqlCom = new SqlCommand();
                InsertSqlCom.CommandText = InsetCommandText;
                SetSqlCommandValues(InsertSqlCom,dt,i,1);
                ID = ExecuteSql(InsertSqlCom);
            }
            return ID;
        }
        private static string GetInsertCommandText(System.Data.DataTable dt)
        {
            string CommandText;
            string Insert;
            string Values;
            int ColmunCount;
            int i;
            ColmunCount = dt.Columns.Count;
            Insert = " insert " + dt.TableName + " (" + dt.Columns[1].ColumnName;
            Values = " Values ( @" + dt.Columns[1].ColumnName;
            for (i = 2; i <= ColmunCount - 1; i++)
            {
                if (dt.Columns[i].DataType.Name != "Byte[]")
                {
                    string ColumnName;
                    ColumnName = dt.Columns[i].ColumnName;
                    Insert = Insert + "," +ColumnName;
                    Values = Values + ",@" + ColumnName;
                }
            }
            CommandText = Insert + ") " + Values + ")" + " ";
            CommandText = CommandText + " SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]";
            return CommandText;
        }

    }

更新类

public class UpdateCommand : OperatorDB
    {
        public static int ExecuteUpdate(System.Data.DataTable dt, int index)
        {
            string UpdateCommandText;
            SqlCommand UpdateSqlCom;
            int ID;
            UpdateSqlCom = new SqlCommand();
            UpdateCommandText = GetUpdateCommandText(dt);
            UpdateSqlCom.CommandText = UpdateCommandText;
            SetSqlCommandValues(UpdateSqlCom,dt,index,0);
            ID = ExecuteSql(UpdateSqlCom);
            return ID;
        }
        public static int ExecuteUpdate(System.Data.DataTable dt)
        {
            string UpdateCommandText;
            SqlCommand UpdateSqlCom;
            int ID = 0;
            UpdateCommandText = GetUpdateCommandText(dt);
            int i;
            for ( i = 0 ;i < dt.Rows.Count;i++)
            {
                UpdateSqlCom = new SqlCommand();
                UpdateSqlCom.CommandText = UpdateCommandText;
                SetSqlCommandValues(UpdateSqlCom,dt,i,0);
                ID = ExecuteSql(UpdateSqlCom);
            }
            return ID;
        }
        public static void UpdateTable(DataTable Dt)
        {
            for(int i=0;i<Dt.Rows.Count;i++)
            {
                if (Dt.Rows[i].RowState.ToString()=="Added")
                {
                    InsertCommand.ExecuteInsert(Dt,i);
                }
                else if(Dt.Rows[i].RowState.ToString()=="Modified")
                {
                    ExecuteUpdate(Dt,i);
                }
                else if(Dt.Rows[i].RowState.ToString()=="Deleted")
                {
                    DeleteCommand.ExecuteDelete(Dt,i);
                }
            }
        }

        private static string GetUpdateCommandText(System.Data.DataTable dt)
        {
            string UpdateCommandText;
            int ColmunCount;
            int i;
            ColmunCount = dt.Columns.Count;

            UpdateCommandText = "Update " + dt.TableName + " set " + dt.Columns[1].ColumnName;
            UpdateCommandText = UpdateCommandText + " = @" + dt.Columns[1].ColumnName;
            for (i = 2; i <= ColmunCount - 1; i++)
            {
                if (dt.Columns[i].DataType.Name != "Byte[]")
                {
                    string ColumnName;
                    ColumnName = dt.Columns[i].ColumnName;
                    UpdateCommandText = UpdateCommandText + "," + ColumnName + "= @" + ColumnName;
                }
            }
            UpdateCommandText = UpdateCommandText + " where " + dt.Columns[0].ColumnName + " = @" + dt.Columns[0].ColumnName;
            return UpdateCommandText;
        }
    }

删除类

public class DeleteCommand : OperatorDB
    {
        public static void ExecuteDelete(DataTable Dt,int Index)
        {
            string DeleteCommandText;
            DeleteCommandText = GetDeleteCommandText(Dt,Index);
            OperatorDB.ExecuteSql(DeleteCommandText);
        }
        public static void ExecuteDelete(DataTable Dt)
        {
            int i;
            for (i = 0 ;i <Dt.Rows.Count;i++)
            {
                string DeleteCommandText;
                DeleteCommandText = GetDeleteCommandText(Dt,i);
                OperatorDB.ExecuteSql(DeleteCommandText);
            }
        }
        public static string GetDeleteCommandText(DataTable Dt,int Index)
        {
            string DeleteCommandText;
            DeleteCommandText = " delete " + Dt.TableName + " where " + Dt.Columns[1].ColumnName + " = "
                + Dt.Rows[Index][0] + " select -1 ";
            return DeleteCommandText;
        }
    }
        虽然.NET已经提供了类似的解决方案,但自己写出来用自己的还是很不错的一个学习过程。

0
相关文章