来自 数据库 2020-04-01 04:53 的文章
当前位置: 网上澳门金莎娱乐 > 数据库 > 正文

动态SQL语句使用心得

在我们的项目中经常需要用到分面功能,而我以前呢用的方法现在看起来都是那麽的笨拙,当时是这样做的,每当要进行数据分页时就专们针对那个表做分页,大家别笑,以前确实好笨。呵呵,虽然当时也有一个想法就是希望能够传入一张表进去进行操作,但那样的话编译是通不过的,因为FROM后面操作的是表变量,而不能是我们自定义的变量,所以当时没有深追究,现在为当时不深入学习而BS一下。 动态SQL需要准备以下内容: 1、@SQL 拼接后的SQL语句,可以是你任意需要的SQL语句如:SET @SQL='SELECT * FROM table WHERE ID=@id' 注意此处的@SQL必须且只能是NTEXT、NVARCHAR、NCHAR类型,如果是其它类型的话其它地方明明没有问题却会报 "过程需要类型为 'ntext/nchar/nvarchar' 的参数"这个错误。同时,如果这里需要传入表名称的话则应这样写:SET @SQL='SELECT * FROM '+@table+'WHERE ID=@id' ,因为上面传入的值是文本类型故会报错。 2、@parameters 所拼接的SQL语句里面的参数,按上面的话这里应该是:SET @parameters='@id INT' 同时这个参数的类型也必须且只能是NTEXT、NVARCHAR、NCHAR类型 3、调用:sp_executesql param1(,param2) 其中param1一般我们作为是@SQL,后面的参数则是我们在@sql中的参数了,但这里要注意的是传参的时候必须是对应的: 复制代码 代码如下: DECLARE @InputId INT ; SET @InputId=1; param2为:@id=@InputId; 以下是写的一个简单的通用分页,有需要可以自行修改: 复制代码 代码如下: ALTER PROCEDURE sp_pager ( @TableName nvarchar(50), -- 表名 @ReturnFields nvarchar(200) = '*', -- 需要返回的列 @PageSize int = 50, -- 每页记录数 @PageIndex int = 1 -- 当前页码 ) AS DECLARE @SQL NVARCHAR(1000) DECLARE @paramters NVARCHAR(200) BEGIN SET NOCOUNT ON SET @SQL='SELECT '+@ReturnFields+' FROM '+@TableName+' WHERE ID(SELECT TOP 1 ID FROM (SELECT TOP '+CAST(@PageSize*@PageIndex AS VARCHAR)+' ID FROM '+@TableName+ ' ORDER BY ID )AS A ORDER BY ID DESC)' PRINT @SQL EXECUTE sp_executesql @SQL,@paramters,@columns=@ReturnFields END

Dapper.NET使用

  • 1、为什么选择Dapper
  • 2、以Dapper(4.0)为例。
  • 2.1 在数据库中建立几张表。
  • 2.2实体类。
  • 3.使用方法
  • 3.1  一对一映射
  • 3.2 一对多映射
  • 3.3 插入实体
  • 3.4 执行存储过程

Dapper是一款轻量级ORM工具(Github)。如果你在小的项目中,使用Entity Framework、NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀。你又觉得ORM省时省力,这时Dapper 将是你不二的选择。

1、为什么选择Dapper

  1. 轻量。只有一个文件(SqlMapper.cs),编译完成之后只有120k(好象是变胖了)
  2. 速度快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。
  3. 支持多种数据库。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server
  4. 可以映射一对一,一对多,多对多等多种关系。
  5. 性能高。通过Emit反射IDataReader的序列队列,来快速的得到和产生对象,性能不错。
  6. 支持FrameWork2.0,3.0,3.5,4.0,4.5

2、以Dapper(4.0)为例。

2.1 在数据库中建立几张表。

图片 1

CREATE TABLE [dbo].[CICUser]
(
    [UserId]                [int] IDENTITY(1, 1) PRIMARY KEY NOT NULL,
    [Username]              [nvarchar](256) NOT NULL,
    [PasswordHash]          [nvarchar](500) NULL,
    [Email]                 [nvarchar](256) NULL,
    [PhoneNumber]           [nvarchar](30) NULL,
    [IsFirstTimeLogin]      [bit] DEFAULT(1) NOT NULL,
    [AccessFailedCount]     [int] DEFAULT(0) NOT NULL,
    [CreationDate]          [datetime] DEFAULT(GETDATE()) NOT NULL,
    [IsActive]              [bit] DEFAULT(1) NOT NULL
)

CREATE TABLE [dbo].[CICRole]
(
    [RoleId]       [int] IDENTITY(1, 1) PRIMARY KEY NOT NULL,
    [RoleName]     [nvarchar](256) NOT NULL,
)

CREATE TABLE [dbo].[CICUserRole]
(
     [Id]   [int] IDENTITY(1, 1) PRIMARY KEY NOT NULL,
     [UserId]  [int] FOREIGN KEY REFERENCES [dbo].[CICUser] ([UserId]) NOT NULL,
     [RoleId]  [int] FOREIGN KEY REFERENCES [dbo].[CICRole] ([RoleId]) NOT NULL
)

图片 2

2.2实体类。

在创建实体类时,属性名称一定要与数据库字段一一对应。

图片 3

图片 4

public class User
    {
        public User()
        {
            Role = new List<Role>();
        }
        public int UserId { get; set; }
        public string UserName { get; set; }       
        public string Password { get; set; }
        public string Email { get; set; }
        public string PhoneNumber { get; set; }
        public bool IsFirstTimeLogin { get; set; }
        public int AccessFailedCount { get; set; }
        public DateTime CreationDate { get; set; }
        public bool IsActive { get; set; }
        public List<Role> Role { get; set; }
    }
 public class Role
    {
        public int RoleId { get; set; }
        public string RoleName { get; set; }
    }
 public class Customer
    {
        public int UserId { get; set; }
        public string UserName { get; set; }       
        public string Password { get; set; }
        public string Email { get; set; }
        public string PhoneNumber { get; set; }
        public bool IsFirstTimeLogin { get; set; }
        public int AccessFailedCount { get; set; }
        public DateTime CreationDate { get; set; }
        public bool IsActive { get; set; }
        public Role Role { get; set; }
    }    

图片 5

本文由网上澳门金莎娱乐发布于数据库,转载请注明出处:动态SQL语句使用心得

关键词: