2020年5月9日 By mikel 分类: JavaScript

这两天用layui的弹出层插件,发现两奇怪的问题:1、弹窗打开事件还未绑定到任何按钮,可是点击form表单中的按钮可以打开我定义的弹出层2、绑定弹出层到按钮,打开弹窗闪退 后面发现真如参考博文所说:我

来源: layui弹出层闪退,layer弹出层闪退,layer弹出层坑 – 小二胡工作室

这两天用layui的弹出层插件,发现两奇怪的问题:

1、弹窗打开事件还未绑定到任何按钮,可是点击form表单中的按钮可以打开我定义的弹出层

2、绑定弹出层到按钮,打开弹窗闪退

 

后面发现真如参考博文所说:我的button也是在form表单中,原因:

原来我在form表单中使用了Button按钮,点击的时候会触发默认事件,而form的action我没填,所以就是弹出层闪退!!

解决办法:

方法一:我将button标签换成其他的,如span就不会出现闪退问题了。

方法二:给button指明类型:type = “button”,因为在form表单中的button默认type = “submit”,改为button就没有表单的默认事件了,感觉法二优于法一。

layui弹出层闪退,layer弹出层闪退,layer弹出层坑 – 小二胡工作室已关闭评论
2020年5月5日 By mikel 分类: 数据库, 架构设计

来源: MyBatis.Net 学习手记 – 菩提树下的杨过 – 博客园

MyBatis.NET的前身为IBatis,是JAVA版MyBatis在.NET平台上的翻版,相对NHibernate、EntityFramework等重量级ORM框架而言,MyBatis.NET必须由开发人员手动写SQL,相对灵活性更大,更容易保证DB访问的性能,适用开发团队里有SQL熟手的场景。

下面是使用步骤:

1、到官网http://code.google.com/p/mybatisnet/ 下载相关dll和文档

Doc-DataAccess-1.9.2.zip
Doc-DataMapper-1.6.2.zip
IBatis.DataAccess.1.9.2.bin.zip
IBatis.DataMapper.1.6.2.bin.zip

一共有4个zip包

2、创建一个Web应用,参考下图添加程序集引用

3、修改web.config,主要是配置log4net,参考下面的内容:

复制代码
 1 <?xml version="1.0"?>
 2 <configuration>
 3     <configSections>
 4         <sectionGroup name="iBATIS">
 5             <section name="logging" type="IBatisNet.Common.Logging.ConfigurationSectionHandler, IBatisNet.Common"/>
 6         </sectionGroup>
 7         <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
 8     </configSections>
 9     <system.web>
10         <compilation debug="true" targetFramework="4.0"/>
11     </system.web>
12     <iBATIS>
13         <logging>
14             <logFactoryAdapter type="IBatisNet.Common.Logging.Impl.Log4NetLoggerFA, IBatisNet.Common.Logging.Log4Net">
15                 <arg key="configType" value="inline"/>
16                 <arg key="showLogName" value="true"/>
17                 <arg key="showDataTime" value="true"/>
18                 <arg key="level" value="ALL"/>
19                 <arg key="dateTimeFormat" value="yyyy/MM/dd HH:mm:ss:SSS"/>
20             </logFactoryAdapter>
21         </logging>
22     </iBATIS>
23     <log4net>
24         <!-- Define some output appenders -->
25         <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
26             <param name="File" value="mybatis.log"/>
27             <param name="AppendToFile" value="true"/>
28             <param name="MaxSizeRollBackups" value="2"/>
29             <param name="MaximumFileSize" value="100KB"/>
30             <param name="RollingStyle" value="Size"/>
31             <param name="StaticLogFileName" value="true"/>
32             <layout type="log4net.Layout.PatternLayout">
33                 <param name="Header" value="[Header]\r\n"/>
34                 <param name="Footer" value="[Footer]\r\n"/>
35                 <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
36             </layout>
37         </appender>
38         <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
39             <layout type="log4net.Layout.PatternLayout">
40                 <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n"/>
41             </layout>
42         </appender>
43         <!-- Set root logger level to ERROR and its appenders -->
44         <root>
45             <level value="DEBUG"/>
46             <appender-ref ref="RollingLogFileAppender"/>
47             <appender-ref ref="ConsoleAppender"/>
48         </root>
49         <!-- Print only messages of level DEBUG or above in the packages -->
50         <logger name="IBatisNet.DataMapper.Configuration.Cache.CacheModel">
51             <level value="DEBUG"/>
52         </logger>
53         <logger name="IBatisNet.DataMapper.Configuration.Statements.PreparedStatementFactory">
54             <level value="DEBUG"/>
55         </logger>
56         <logger name="IBatisNet.DataMapper.LazyLoadList">
57             <level value="DEBUG"/>
58         </logger>
59         <logger name="IBatisNet.DataAccess.DaoSession">
60             <level value="DEBUG"/>
61         </logger>
62         <logger name="IBatisNet.DataMapper.SqlMapSession">
63             <level value="DEBUG"/>
64         </logger>
65         <logger name="IBatisNet.Common.Transaction.TransactionScope">
66             <level value="DEBUG"/>
67         </logger>
68         <logger name="IBatisNet.DataAccess.Configuration.DaoProxy">
69             <level value="DEBUG"/>
70         </logger>
71     </log4net>
72 </configuration>
复制代码

4、添加Providers.config

把从官方下载的压缩包解开,就能找到providers.config文件,里面定义了MyBatis.Net支持的各种数据库驱动,本例以oracle为例,把其它不用的db provider全删掉,只保留下oracleClient1.0,同时把enabled属性设置成true,参考下面这样:

复制代码
 1 <?xml version="1.0"?>
 2 <providers xmlns="http://ibatis.apache.org/providers"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 4 
 5     <clear/>    
 6     
 7     <!--Oracle Support-->
 8     <provider
 9       name="oracleClient1.0"
10       description="Oracle, Microsoft provider V1.0.5000.0"
11       enabled="true"
12       assemblyName="System.Data.OracleClient, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.OracleClient.OracleConnection"
13       commandClass="System.Data.OracleClient.OracleCommand"
14       parameterClass="System.Data.OracleClient.OracleParameter"
15       parameterDbTypeClass="System.Data.OracleClient.OracleType"
16       parameterDbTypeProperty="OracleType"
17       dataAdapterClass="System.Data.OracleClient.OracleDataAdapter"
18       commandBuilderClass="System.Data.OracleClient.OracleCommandBuilder"
19       usePositionalParameters="false"
20       useParameterPrefixInSql="true"
21       useParameterPrefixInParameter="false"
22       parameterPrefix=":"
23       allowMARS="false"
24   />
25     
26 </providers>
复制代码

把这个文件复制到Web项目根目录下

5、添加SQLMap.config,内容如下:

复制代码
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper"
 3               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 4 
 5     <settings>
 6         <setting useStatementNamespaces="false"/>
 7         <setting cacheModelsEnabled="true"/>
 8     </settings>
 9 
10     <!--db provider配置文件路径-->
11     <providers resource="providers.config"/>
12 
13     <!--db provider类型及连接串-->
14     <database>
15         <provider name="oracleClient1.0" />
16         <dataSource name="oracle" connectionString="Data Source=ORCL;Persist Security Info=True;User ID=scott;Password=tiger;Unicode=True" />
17     </database>
18 
19     <!--db与Entity的映射文件-->
20     <sqlMaps>
21         <sqlMap resource="Maps/ProductMap.xml"/>
22     </sqlMaps>
23 
24 </sqlMapConfig>
复制代码

这个文件也复制到Web项目根目录下,它的作用主要是指定db连接串,告诉系统providers.config在哪? 以及db与entity的映射文件在哪?(映射文件后面会讲到,这里先不管)

6、在Oraccle中先建表Product以及Sequence,方便接下来测试

复制代码
 1 -- CREATE TABLE
 2 CREATE TABLE PRODUCT
 3 (
 4   PRODUCTID      NUMBER NOT NULL,
 5   PRODUCTNAME    VARCHAR2(100),
 6   PRODUCTCOMPANY VARCHAR2(100),
 7   SIGNDATE       DATE,
 8   UPDATEDATE     DATE
 9 );
10 -- CREATE/RECREATE PRIMARY, UNIQUE AND FOREIGN KEY CONSTRAINTS 
11 ALTER TABLE PRODUCT
12   ADD CONSTRAINT PK_PRODUCT_ID PRIMARY KEY (PRODUCTID);
13 
14 -- CREATE SEQUENCE 
15 CREATE SEQUENCE SQ_PRODUCT
16 MINVALUE 1
17 MAXVALUE 9999999999999999999999999
18 START WITH 1
19 INCREMENT BY 1
20 CACHE 20;
复制代码

7、创建Maps目录,并在该目录下,添加映射文件ProductMap.xml,内容如下:

复制代码
 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <sqlMap namespace="EntityModel" xmlns="http://ibatis.apache.org/mapping"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 4 
 5     <alias>
 6         <!--类的别名-->
 7         <typeAlias alias="Product" type="Web.Product,Web"/>
 8     </alias>
 9 
10     <resultMaps>
11         <!--Product类与db表的映射-->
12         <resultMap id="SelectAllResult" class="Product">
13             <result property="ProductId" column="ProductId"/>
14             <result property="ProductName" column="ProductName"/>
15             <result property="ProductCompany" column="ProductCompany" />
16             <result property="SignDate" column="SignDate"  />
17             <result property="UpdateDate" column="UpdateDate" />
18         </resultMap>
19     </resultMaps>
20 
21     <statements>
22 
23         <!--查询所有记录-->
24         <select id="SelectAllProduct" resultMap="SelectAllResult">
25             <![CDATA[SELECT ProductId,ProductName,ProductCompany,SignDate,UpdateDate FROM Product]]>
26         </select>
27 
28         <!--查询单条记录-->
29         <select id="SelectByProductId" parameterClass="int" resultMap="SelectAllResult" extends="SelectAllProduct">
30             <![CDATA[ where ProductId = #value#  ]]>
31         </select>
32 
33         <!--插入新记录-->
34         <insert id="InsertProduct" parameterClass="Product">    
35             <!--oracle sequence的示例用法-->
36             <selectKey property="ProductId" type="pre" resultClass="int">
37                 select SQ_Product.nextval as ProductId from dual
38             </selectKey>
39             <![CDATA[INSERT into Product(ProductId,ProductCompany,ProductName,SignDate,UpdateDate)
40             VALUES(#ProductId#,#ProductCompany#, #ProductName# , #SignDate# , #UpdateDate#)]]>
41         </insert>
42 
43         <!--更新单条记录-->
44         <update id="UpdateProduct" parameterClass="Product">
45             <![CDATA[Update Product SET ProductName=#ProductName#,
46             ProductCompany=#ProductCompany#,            
47             SignDate=#SignDate#,
48             UpdateDate=#UpdateDate#
49             Where ProductId=#ProductId#]]>
50         </update>
51 
52         <!--根据主键删除单条记录-->
53         <delete id="DeleteProductById" parameterClass="int">
54             <![CDATA[Delete From Product Where ProductId=#value#]]>
55         </delete>
56 
57 
58     </statements>
59 
60 </sqlMap>
复制代码

它的作用就是指定各种sql,以及db表与entity的映射规则,注意下insert中Sequence的用法!

8、创建实体类Product

复制代码
 1 using System;
 2 
 3 namespace Web
 4 {
 5    public class Product
 6     {
 7        public int ProductId { get; set; }
 8        public string ProductName { get; set; }
 9        public string ProductCompany { get; set; }
10        public DateTime SignDate { get; set; }
11        public DateTime UpdateDate { get; set; }
12 
13        public Product() { }
14     }
15 }
复制代码

9、写一个通用的BaseDA类,对MyBatis.Net做些基本的封装

复制代码
 1 using IBatisNet.DataMapper;
 2 using System.Collections.Generic;
 3 
 4 namespace Web
 5 {
 6     public static class BaseDA
 7     {
 8         public static int Insert<T>(string statementName, T t)
 9         {
10             ISqlMapper iSqlMapper = Mapper.Instance();
11             if (iSqlMapper != null)
12             {
13                 return (int)iSqlMapper.Insert(statementName, t);
14             }
15             return 0;
16         }
17 
18         public static int Update<T>(string statementName, T t)
19         {
20             ISqlMapper iSqlMapper = Mapper.Instance();
21             if (iSqlMapper != null)
22             {
23                 return iSqlMapper.Update(statementName, t);
24             }
25             return 0;
26         }
27 
28         public static int Delete(string statementName, int primaryKeyId)
29         {
30             ISqlMapper iSqlMapper = Mapper.Instance();
31             if (iSqlMapper != null)
32             {
33                 return iSqlMapper.Delete(statementName, primaryKeyId);
34             }
35             return 0;
36         }
37 
38         public static T Get<T>(string statementName, int primaryKeyId) where T : class
39         {
40             ISqlMapper iSqlMapper = Mapper.Instance();
41             if (iSqlMapper != null)
42             {
43                 return iSqlMapper.QueryForObject<T>(statementName, primaryKeyId);
44             }
45             return null;
46         }
47 
48         public static IList<T> QueryForList<T>(string statementName, object parameterObject = null)
49         {
50             ISqlMapper iSqlMapper = Mapper.Instance();
51             if (iSqlMapper != null)
52             {
53                 return iSqlMapper.QueryForList<T>(statementName, parameterObject);
54             }
55             return null;
56         }
57     }
58 }
复制代码

10、然后就可以在Default.aspx.cs上测试了,参考下面的代码:

复制代码
using System;
using System.Web.UI;


namespace Web
{
    public partial class Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //插入
            var insertProductId = BaseDA.Insert<Product>("InsertProduct", new Product()
            {
                ProductCompany = "INFOSKY",
                ProductName = "iGSA2",
                SignDate = DateTime.Now,
                UpdateDate = DateTime.Now
            });

            //查单条记录
            var model = BaseDA.Get<Product>("SelectByProductId", insertProductId);
            ShowProduct(model);

            Response.Write("<hr/>");

            //修改记录
            if (model != null)
            {
                model.ProductName = (new Random().Next(0, 99999999)).ToString().PadLeft(10, '0');
                int updateResult = BaseDA.Update<Product>("UpdateProduct", model);
                Response.Write("update影响行数:" + updateResult + "<br/><hr/>");
            }

            //查列表
            var products = BaseDA.QueryForList<Product>("SelectAllProduct");

            foreach (var pro in products)
            {
                ShowProduct(pro);
            }

            Response.Write("<hr/>");

            //删除记录
            int deleteResult = BaseDA.Delete("DeleteProductById", insertProductId);
            Response.Write("delete影响行数:" + deleteResult + "<br/><hr/>");

        }

        void ShowProduct(Product pro)
        {
            if (pro == null) return;
            Response.Write(string.Format("{0}&nbsp;,&nbsp;{1}&nbsp;,&nbsp;{2}&nbsp;,&nbsp;{3}&nbsp;,&nbsp;{4}<br/>",
                pro.ProductId, pro.ProductName, pro.ProductCompany, pro.SignDate, pro.UpdateDate));
        }
    }
}
复制代码

整个项目的目录结构如下:

示例源代码下载:http://files.cnblogs.com/yjmyzz/MyBatisSample.zip

MyBatis.Net 学习手记 – 菩提树下的杨过 – 博客园已关闭评论
2020年4月20日 By mikel 分类: 数据库

来源: SQL Server之深入理解STUFF – Jeffcky – 博客园

前言

最近项目无论查询报表还是其他数据都在和SQL Server数据库打交道,对于STUFF也有了解,但是发现当下一次再写SQL语句时我还得查看相关具体用法,说到底还是没有完全理解其原理,所以本节我们来谈谈STUFF,Jeff是在项目中哪里不熟悉,哪里不会或者哪里耗时比较多就会去深入理解和巩固即使是很基础的知识,直到完全不用浪费时间去查阅相关资料,这是我的出发点。

深入理解STUFF

STUFF字符串函数是将字符串插入到另一个字符串中。它会删除开始位置第一个字符串中的指定长度的字符,然后将第二个字符串插入到开始位置的第一个字符串中,语法如下。

STUFF(<character_expression>,<开始>,<长度>,<character_expression>)
<character_expression>参数是给定的字符串数据,可以是字符或二进制数据的常量,变量或列。<start>参数是一个整数值,指定开始删除和插入的位置,可以是BIGINT类型。如果<开始>或<长度>参数为负数,则返回NULL字符串。如果<start>参数比第一个<character_expression>长,则返回一个NULL字符串。 <length>参数可以是BIGINT类型,它是一个整数,指定要删除的字符数。如果<length>比第一个<character_expression>长,则删除发生到最后一个<character_expression>中的最后一个字符。

复制代码
DECLARE @FullName       VARCHAR(100)
DECLARE @Alias          VARCHAR(20)

SET @FullName = 'Jeffcky Wang'
SET @Alias = ' "Superman" '

SELECT STUFF(@FullName, CHARINDEX(' ', @FullName), 1, @Alias) AS [FullName]
复制代码

 

如上STUFF函数中的第一个参数我们给定的是@FullName,第二个是开始的位置,我们通过CHARINDEX函数找出@FullName以空格隔开的的位置返回,最后由@Alias来代替,结果如图所示。

DECLARE @Time VARCHAR(10)
SET @Time = '1030'

SELECT STUFF(@Time, 3, 0, ':') AS [HH:MM]

我们给定的字符串为@Time即1030,我们从第3个位置开始,删除长度为0,此时则在3前面插入冒号,结果如上图输出10:30。

DECLARE @CreditCardNumber  VARCHAR(20)
SET @CreditCardNumber = '370200199408103544'

SELECT STUFF(@CreditCardNumber, LEN(@CreditCardNumber) -3, 4,
       'XXXX') AS [Output]

如上我们将身份证通过STUFF将最后四位用XXXX代替。以上是STUFF最基础的用法。STUFF最常见的用途莫过于结合FOR XML PATH对返回JSON字符串的拼接。首先利用FOR XML PATH则返回XML格式的字符串,我们将FOR XML PATH添加到查询的末尾,此时允许我们将查询的结果作为XML元素输出,元素名称包含在PATH参数中。。

SELECT TOP 5 ',' + Name 
              FROM  Production.Product
              FOR XML PATH ('')

,Adjustable Race,All-Purpose Bike Stand,AWC Logo Cap,BB Ball Bearing,Bearing Ball

此时我们利用STUFF将上述利用FOR XML PATH生成的字符串中的前置逗号去掉,如下:

SELECT Name = STUFF((
            SELECT TOP 5 ',' + NAME
            FROM Production.Product
            FOR XML PATH('')
            ), 1, 1, '')

比如我们要查询各种产品中的产品列表名称,最后我们改造成如下:

复制代码
SELECT TOP 5 p2.ProductID, Name = STUFF((
            SELECT ',' + NAME
            FROM Production.Product AS p1
            WHERE p1.ProductID = p2.ProductID
            FOR XML PATH('')
            ), 1, 1, '') FROM Production.Product AS p2
GROUP BY p2.ProductID
复制代码

接下来我们利用STUFF结合FOR XML PATH来拼接JSON字符串,如下:

复制代码
DECLARE @content VARCHAR(MAX)

SET @content = (SELECT '['+ STUFF((SELECT TOP 5 ',{"ProductName": "' + ProductName + '","Price": "' + CONVERT(VARCHAR, Price) + '","Quantity": "' + CONVERT(VARCHAR, quantity) + '","Inserton": "' + CONVERT(VARCHAR, Inserton, 105) + '"}' FROM ProductList 
 FOR XML PATH('')), 1, 1,''
 ) 
 + ']'[ProductDetail])

PRINT @content
复制代码

结果如上正确输出JSON字符串,接下来我们将如上拼接换行再试试。

复制代码
DECLARE @content VARCHAR(MAX)

SET @content = ( SELECT '['
                        + STUFF(( SELECT TOP 5
                                            ',{"ProductName": "' + ProductName
                                            + '","Price": "'
                                            + CONVERT(VARCHAR, Price)
                                            + '","Quantity": "'
                                            + CONVERT(VARCHAR, quantity)
                                            + '","Inserton": "'
                                            + CONVERT(VARCHAR, Inserton, 105)
                                            + '"}'
                                  FROM      ProductList
                                FOR
                                  XML PATH('')
                                ), 1, 1, '') + ']' [ProductDetail]
               )

PRINT @content
复制代码

如上是利用SQL Prompt直接格式化换行,结果依然正确输出JSON字符串,我们再来手动换行试试。

复制代码
DECLARE @content VARCHAR(MAX)

SET @content = (SELECT 
'['+ STUFF((SELECT TOP 5 ',
{"ProductName": "' + ProductName 
+ '","Price": "' + CONVERT(VARCHAR, Price) 
+ '","Quantity": "' + CONVERT(VARCHAR, quantity) 
+ '","Inserton": "' + CONVERT(VARCHAR, Inserton, 105) 
+ '"}' FROM ProductList 
 FOR XML PATH('')), 1, 1,''
 ) 
 + ']'[ProductDetail])

PRINT @content
复制代码

结果输出如上我们不期望的字符串,主要是由FOR XML PATH造成的,比如我们利用FOR XML PATH进行如下查询:

SELECT  '    '
FOR     XML PATH('')

当我们利用FOR XML  PATH查询数据时,如果字符串中包含空格时会造成出现以如上错误的字符串来填充,所以此时我们为了消除这种错误格式,我们将上述继续添加参数。

SELECT  '    '
FOR     XML PATH(''),TYPE

此时我们将上述输出JSON字符串不错误的格式修改成如下即可:

复制代码
DECLARE @content VARCHAR(MAX)

SET @content = (SELECT 
'['+ STUFF((SELECT TOP 5 ',
{"ProductName": "' + ProductName 
+ '","Price": "' + CONVERT(VARCHAR, Price) 
+ '","Quantity": "' + CONVERT(VARCHAR, quantity) 
+ '","Inserton": "' + CONVERT(VARCHAR, Inserton, 105) + '"}' FROM ProductList 
 FOR XML PATH('') ,TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1,''
 ) 
 + ']'[ProductDetail])

PRINT @content
复制代码

或者我们对上述输出的错误字符串进行替换,如下:

复制代码
select t.PK, 
    ltrim(rtrim(replace(
    (select ' ' + isnull(ti.Column1, '') + ' ' + isnull(ti.Column2, '')
     from yourTable ti 
     where ti.PK = t.PK
     for xml path (''))
     , '&#x20;', ''))) fruits
from yourTable t
group by t.PK;
复制代码

这里我们解决了利用STUFF有可能输出JSON字符串带有错误的字符串的问题,在利用STUFF输出JSON字符串时只要有一列数据包含NULL,那么返回的数据则为空,那么我们在对列数据通过ISNULL来进行判断,比如如下将输出NULL。

复制代码
DECLARE @content VARCHAR(MAX)

SET @content = (SELECT 
'['+ STUFF((SELECT TOP 5 ',
{"ProductName": "' + NULL 
+ '","Price": "' + CONVERT(VARCHAR, Price) 
+ '","Quantity": "' + CONVERT(VARCHAR, quantity) 
+ '","Inserton": "' + CONVERT(VARCHAR, Inserton, 105) + '"}' FROM ProductList 
 FOR XML PATH('') ,TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1,''
 ) 
 + ']'[ProductDetail])

PRINT @content
复制代码

所以此时我们必须通过ISNULL来判断列数据是否为NULL,修改成如下形式:

复制代码
DECLARE @content VARCHAR(MAX)

SET @content = (SELECT 
'['+ STUFF((SELECT TOP 5 ',
{"ProductName": "' + ISNULL(ProductName,'') 
+ '","Price": "' + CONVERT(VARCHAR, Price) 
+ '","Quantity": "' + CONVERT(VARCHAR, quantity) 
+ '","Inserton": "' + CONVERT(VARCHAR, Inserton, 105) + '"}' FROM ProductList 
 FOR XML PATH('') ,TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1,''
 ) 
 + ']'[ProductDetail])

PRINT @content
复制代码
SQL Server之深入理解STUFF – Jeffcky – 博客园已关闭评论
2020年4月20日 By mikel 分类: 数据库

来源: SQL SERVER 如何把1列多行数据 合并成一列显示 – 岁月寒风 – 博客园

示例

修改前:1列多行数据

修改后:合并成一列

 

示例语句

1
2
3
4
5
6
7
8
9
10
11
select
类别,
    名称 = (
        stuff(
            (select ',' + 名称 from Table_A where 类别 = A.类别 for xml path('')),
            1,
            1,
            ''
        )
    )
from Table_A as group by 类别

 

把得到的内容以XML的形式显示

for xml path(”)

 

把拼接的内容的第一个“,”去掉

stuff((select ‘,’ + ep_name from ep_detail where ep_classes = a.ep_classes for xml path(”)), 1, 1, ”)

SQL SERVER 如何把1列多行数据 合并成一列显示 – 岁月寒风 – 博客园已关闭评论
2020年4月20日 By mikel 分类: 数据库

来源: 通过SQL语句提取存储过程中的内容_数据库_weixin_30462049的博客-CSDN博客

首先,列出服务器上所有数据库。

 

— 获取数据库列表
SELECT name FROM master.dbo.sysdatabases ORDER BY name

 

 

其次,这是一种让所有的用户从数据库中创建存储过程。

 

— 获取存储过程列表
— Type = ‘P’ –> 存储过程
— Category = 0 –> 用户创建的
SELECT * FROM sysobjects WHERE type = ‘ P ‘ AND category = 0 ORDER BY name

 

 

然后我们就可以检索查询与存储过程内容如下:

 

— 获取存储过程内容
— Name = Stored Procedure Name.
SELECT text
FROM syscomments
WHERE id = ( SELECT id FROM sysobjects WHERE name = ‘ 存储过程名称 ‘)
通过SQL语句提取存储过程中的内容_数据库_weixin_30462049的博客-CSDN博客已关闭评论
2020年4月18日 By mikel 分类: 开发笔记

来源: 防止form表单多次提交_JavaScript_旧城以南的博客-CSDN博客

点击提交按钮两次。
点击刷新按钮。
使用浏览器后退按钮重复之前的操作,导致重复提交表单。
使用浏览器历史记录重复提交表单。
浏览器重复的HTTP请求。

用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数据库中,这是一个比较棘手的问题。我们可以从客户端和服务器端一起着手,设法避免同一表单的重复提交。

1、js禁掉提交按钮。

表单提交后使用JavaScript使提交按钮disable。这种方法防止心急的用户多次点击按钮。但有个问题,如果客户端把JavaScript给禁止掉,这种方法就无效了

 

2、使用Post/Redirect/Get模式。

在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。

这能避免用户按F5导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。

 

3、在session中存放一个特殊标志。

在服务器端,生成一个唯一的标识符,将它存入session,同时将它写入表单的隐藏字段中,然后将表单页面发给浏览器,用户录入信息后点击提交,在服务器端,获取表单中隐藏字段的值,与session中的唯一标识符比较,相等说明是首次提交,就处理本次请求,然后将session中的唯一标识符移除;不相等说明是重复提交,就不再处理。

这使你的web应用有了更高级的XSRF保护。

请见如下代码:

view plain copy
<?php
session_start();
//根据当前SESSION生成随机数
$code = mt_rand(0,1000000);
$_SESSION[‘code’] = $code;
?>
在页面表单上将随机数作为隐藏值进行传递,代码如下:
<input type=”hidden” name=”originator” value=”<?=$code?>”>

在接收页面的PHP代码如下:

<?php
session_start();
if(isset($_POST[‘originator’])) {
if($_POST[‘originator’] == $_SESSION[‘code’]){
// 处理该表单的语句,省略
}else{
echo ‘请不要刷新本页面或重复提交表单!’;
}
}
?>

4.使用header函数转向

除了上面的方法之外,还有一个更简单的方法,那就是当用户提交表单,服务器端处理后立即转向其他的页面,代码如下所示。

if (isset($_POST[‘action’]) && $_POST[‘action’] == ‘submitted’) {

//处理数据,如插入数据后,立即转向到其他页面

header(‘location:submits_success.php’);

}

这样,即使用户使用刷新键,也不会导致表单的重复提交,因为已经转向新的页面,而这个页面脚本已经不理会任何提交的数据了。

5.表单过期的处理

在开发过程中,经常会出现表单出错而返回页面的时候填写的信息全部丢失的情况,为了支持页面回跳,可以通过以下两种方法实现。

1.使用header头设置缓存控制头Cache-control。

header(‘Cache-control: private, must-revalidate’); //支持页面回跳

2.使用session_cache_limiter方法。

session_cache_limiter(‘private, must-revalidate’); //要写在session_start方法之前

下面的代码片断可以防止用户填写表单的时候,单击“提交”按钮返回时,刚刚在表单上填写的内容不会被清除:

session_cache_limiter(‘nocache’);

session_cache_limiter(‘private’);

session_cache_limiter(‘public’);

session_start();

//以下是表单内容,这样在用户返回该表单时,已经填写的内容不会被清空

 

6、在数据库里添加约束。

在数据库里添加唯一约束或创建唯一索引,防止出现重复数据。这是最有效的防止重复提交数据的方法。
————————————————
版权声明:本文为CSDN博主「旧城以南」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40072737/article/details/80088366

防止form表单多次提交_JavaScript_旧城以南的博客-CSDN博客已关闭评论
2020年4月18日 By mikel 分类: JavaScript

来源: easyui datagrid列拖拽 – wuwenhai – 博客园

还是那句话:“客户是上帝,他们怎么说我们这些程序猿只能尽自己所能来达到效果。”我觉着吧,他们太厉害了 看似没什么必要的功能,硬是能想出来逼着我这个前端还比较薄弱的人来实现。这次提出的要求 如题:datagrid列要能够拖拽。由于之前项目是使用easyui做的,可是datagrid它并没有提供列拖拽的功能。然后又去网上搜索了下,丫丫的竟然也没多少这方面实现的例子。我拍了拍头郁闷呐,又得自己做。好吧 自己做就自己做吧。说下思路:首先easyui 它有提供了拖拽的功能Draggable,那我们就可以想 拖拽标题头到另外的标题头上面我们就对datagrid的columns重新绑定一次 并刷新datagrid这个功能不就行了?没错思路可行,let’s do it!by 梨洛 。实现上代码来解释

复制代码
<script type="text/javascript">
    var cols = [{ field: 'testName', title: '<span class="dropitem">测试名</span>', align: 'center',width:120 },
               { field: 'testValue', title: '<span class="dropitem">测试值</span>', align: 'center', width: 120}];
    var url="/Test/Test1Data";
    $(document).ready(function () {
        init();
        drag();//绑定datagrid,绑定拖拽
    });
    function init() {
        $("#test").datagrid({
            url: url,
            type: "post",
            datatype: "json",
            width: 600,
            height: 280,
            loadMsg: "数据加载中,请稍后...",
            nowrap: true,
            rownumbers: false,
            pagination: true,
            singleSelect: true,
            columns: [cols],
            //bind数据成功重新设置拖动对象
            onLoadSuccess: function (data) {          
                drag();
            }
        });
    }
    //拖动drag和drop都是datagrid的头的datagrid-cell
    function drag() {
        $('.datagrid-header-inner .datagrid-cell').draggable({
            revert: true,
            proxy: 'clone'
        }).droppable({
            accept: '.datagrid-header-inner .datagrid-cell',
            onDrop: function (e, source) {
                //取得拖动源的html值
                var src = $(e.currentTarget.innerHTML).html();
                //取得拖动目标的html值
                var sou = $(source.innerHTML).html();
                var tempcolsrc;//拖动后源和目标列交换
                var tempcolsou;
                var tempcols=[];
                for (var i = 0; i < cols.length; i++) {
                    if (cols[i].title == sou) {
                        tempcolsrc = cols[i];//循环读一遍列把源和目标列都记下来
                    }
                    else if (cols[i].title == src) {
                        tempcolsou = cols[i];
                    }
                }
                for (var i = 0; i < cols.length; i++) {
                    //再循环一遍,把源和目标的列对换
                    var col = {
                        field: cols[i].field,
                        title: cols[i].title,
                        align: cols[i].align,
                        width: cols[i].width
                    };
                    if (cols[i].title == sou) {
                        col = tempcolsou;
                    }
                    else if (cols[i].title == src) {
                        col = tempcolsrc;
                    }
                     tempcols.push(col);  
                }
                 cols = tempcols;
                 //1秒后执行重绑定datagrid操作。可能是revert需要时间,这边如果没有做延时就直接重绑 就会出错。
                 //我目前的水平就想到这个笨办法,各位如果有好的想法建议可以提出来讨论下。
                timeid = setTimeout("init()", 1000);
            }
        });
    }
</script>

<div id="test"></div>
复制代码

上效果图:

原datagrid

拖动列

拖动后两列交换

再附上这几篇文章的源码

相关JQuery取元素什么的 请参看前两篇 jquery模拟enter按下
转载请注明出处http://www.cnblogs.com/wujie6166

easyui datagrid列拖拽 – wuwenhai – 博客园已关闭评论
2020年4月16日 By mikel 分类: 数据库

来源: Windows 8及以上系统安装好SQL Server 2008之后找不到SQL Server配置管理器的问题 – EasonJim – 博客园

直接的方法:

打开【运行】->输入【C:\Windows\SysWOW64\mmc.exe /32 C:\Windows\SysWOW64\SQLServerManager10.msc】即可。

以上是针对2008的,同样,更高版本的以此内推。

Windows 8及以上系统安装好SQL Server 2008之后找不到SQL Server配置管理器的问题 – EasonJim – 博客园已关闭评论
2020年4月8日 By mikel 分类: PHP

来源: thinkphp在php5.6以上版本显示”No input file specified” – 韦书文 – 博客园

今天在练习php的时候,有些新功能只能兼容php7+以上的版本,我只好切换php的版本。后来发现再次打开thinkphp时,网址进入登入页面,但是却显示”No input file specified”,如下图所示:

上网查了一下才知道,PHP5.6以上的是fast_cgi模式,而在某些情况下,不能正确识别path_info所造成的错误,这个时候,你只需要更改.htaccess文件,如下图所示

只需要在index.php后面添加”?”即可,如下图所示

再次打开页面将正常显示

thinkphp在php5.6以上版本显示”No input file specified” – 韦书文 – 博客园已关闭评论
2020年4月6日 By mikel 分类: ASP.NET, C#

来源: [C#/ASP.NET]List中Sort()、Find()、FindAll()、Exist()的使用方法 – zock – 博客园

[C#/ASP.NET]中List<T>真的非常好用。一个例子简单说明一下List<>中Sort()、Find()、FindAll()、Exist()的使用方法

简单介绍:

List<T>.Sort() → 排序T

List<T>.Find() → 找出一個T

List<T>.FindAll() →找出多個T

List<T>.Exist() →判斷T是否存在

示例代码:

页面文件GenericList.aspx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="GenericList.aspx.cs" Inherits="GenericList" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>GenericList</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        原始資料:
        <asp:GridView ID="GridView1" runat="server">
        </asp:GridView>
    </div>
    </form>
</body>
</html>

后台代码文件GenericList.aspx.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class GenericList : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        List<Person> lstPerson = new List<Person>();
        lstPerson.Add(new Person(1, "puma", 10));
        lstPerson.Add(new Person(2, "F6 Team", 20));
        lstPerson.Add(new Person(3, "ASP.NET", 30));
        lstPerson.Add(new Person(4, "Dotblogs", 40));
        //原始資料顯示在GridView上
        this.GridView1.DataSource = lstPerson;
        this.GridView1.DataBind();
        //List<T>.Find()
        //找出Name='puma'的Person
        Response.Write("找出Name='puma'的Person→ ");
        Response.Write(lstPerson.Find(delegate(Person p) { return p.Name == "puma"; }).ToString() + "<p>");
        //List<T>.FindAll()
        //找出Age>10的數目
        Response.Write("找出Age>10的數目→ ");
        Response.Write(lstPerson.FindAll(delegate(Person p) { return p.Age > 10; }).Count.ToString() + "<p>");
        //List<T>.Exists()
        //檢查Name='F6'是否存在
        Response.Write("檢查Name='F6'是否存在→ ");
        Response.Write(lstPerson.Exists(delegate(Person p) { return p.Name == "F6"; }).ToString() + "<p>");
        //List<T>.Sort()
        //依Name升冪排序
        Response.Write("<p>依Name升冪排序↑<br/>");
        lstPerson.Sort(delegate(Person p1, Person p2) { return Comparer<string>.Default.Compare(p1.Name, p2.Name); });
        foreach (Person p in lstPerson)
        {
            Response.Write(p.ToString() + "<br/>");
        }
        //List<T>.Sort()
        //依Name降冪排序
        Response.Write("<p>依Name降冪排序↓<br/>");
        lstPerson.Sort(delegate(Person p1, Person p2) { return Comparer<string>.Default.Compare(p2.Name, p1.Name); });
        foreach (Person p in lstPerson)
        {
            Response.Write(p.ToString() + "<br/>");
        }
    }
}
public class Person
{
    private int _ID;
    private string _Name;
    private int _Age;
    public Person(int ID, string Name, int Age)
    {
        _ID = ID;
        _Name = Name;
        _Age = Age;
    }
    public int ID
    {
        set { _ID = value; }
        get return _ID; }
    }
    public string Name
    {
        set { _Name = value; }
        get return _Name; }
    }
    public int Age
    {
        set { _Age = value; }
        get return _Age; }
    }
    public override string ToString()
    {
        return string.Format("ID:{0},Name:{1},Age:{2}", _ID, _Name, _Age);
    }
}

本文地址:http://www.cnblogs.com/atree/archive/2011/02/25/Asp-Net_List_Sort_Find_FindAll_Exist.html

[C#/ASP.NET]List中Sort()、Find()、FindAll()、Exist()的使用方法 – zock – 博客园已关闭评论
备案信息冀ICP 0007948