• 在数据库中提供只读数据


    专案需要,需要在数据库中提供一个些数据,可让用户读取,但不能修改。
    或许你需要创建一个表,手动添加这些静态数据,这样的话,用户有可能直接打开数据库修改。
    也许你会创建一个table-valued 函数并加密。

    解决方案很多,下面Insus.NET使用Clr存储过程来实现,把数据直接设置于CLR程序中。当部署于SQL时,如果用户没有拿到dll,也许一时无法修改,仅能只读了。

    创建一个CLR存储过程:



    可复制代码:

    [Microsoft.SqlServer.Server.SqlProcedure]
        public static void SiteInfor()
        {       
           //创建变量
            SqlMetaData Id;
            SqlMetaData Name;
            SqlMetaData Key;
            SqlDataRecord record;
    
            //创建metadata列(字段)。
            Id = new SqlMetaData("Id", SqlDbType.Int);
            Name = new SqlMetaData("Name", SqlDbType.NVarChar,25);
            Key = new SqlMetaData("Key", SqlDbType.NVarChar,30);
    
            //使用metadata列创建一笔新记录
            record = new SqlDataRecord(new SqlMetaData[] { Id, Name, Key });
    
            //为列域赋值。
            record.SetInt32(0,1);
            record.SetString(1, "DG");
            record.SetString(2, "5a01ceba-4168-44a2-a68a-5b430e5ad127");
    
            //将记录发送到调用程序。
            SqlContext.Pipe.Send(record);
        }
    View Code


    部署至SQL中,有两种方式,一是手动在Microsoft SQL Management Studio下进行,还有一个是在查询分析器执行SQL语句。两种方法,均在前面的CLR相关文章中详细提及。

    部署成功,我们可以在SQL数据库可看到CLR存储过程:



    此存储过程,我们是无法Modify的。

    试执行此存储过程:

     

    下面内容于2015-04-03 09:40分修改或补充:
    针对最后一段代码,修改如下:

    SqlContext.Pipe.SendResultsStart(record);
    SqlContext.Pipe.SendResultsRow(record);
    SqlContext.Pipe.SendResultsEnd();
    View Code
  • 相关阅读:
    在VS中用CLAPACK解决广义特征值问题
    再议:__cdecl与__stdcall 调用约定在动态链接库调用中不同的表现
    类成员析构、虚析构函数、动态生成对象相关的 关于析构顺序的杂谈
    C++ 中dynamic_cast的使用方法
    函数传值 复制构造函数 深度拷贝
    hdoj_1867A + B for you again
    如何判断一个数是否为素数
    hdoj_2087剪花布条
    STL容器之优先队列
    hdoj_4006优先队列的使用
  • 原文地址:https://www.cnblogs.com/insus/p/4384411.html
Copyright © 2020-2023  润新知