Ⅰ 请问sql语法中特殊字符包含哪些,越详细越好
我曾经写了一个扩展方法(C#3.0新特性)来处理SQL特殊字符,比较全。提醒一下,不要用js来过滤,js是客户端运行的,不可靠。代码如下: #region 处理t-sql中插入的值,过滤特殊字符 /// <summary> /// 处理t-sql中插入的值,防止意外字符导致错误 /// </summary> /// <param name="sqlValue">需要插入的值</param> /// <returns></returns> public static string DealWithSqlValue(this string sqlValue) { sqlValue = sqlValue.Trim().Replace("'", "''").Replace("]", "]]").Replace("%", "[%]").Replace("_", "[_]").Replace("^", "[^]"); return sqlValue; } #endregion
采纳哦
Ⅱ C#中 <summary>是什么
是XML注释
xml注释都在三个向前的斜线之后(///),两条斜线表示是一个注释,编译器将忽略后面的内容,三条斜线告诉编译器,后面是XML注释,需要适当地处理,summary看英文意思就知道应该是对summary下面所写内容功能的总结、概括
Ⅲ 使用SQL语句创建学生成绩数据库db_Stu,该数据库有一个主数据库文件(’F:\ db_Stu.mdf')和事务日志(’F:
有个问题 刚好符合你的要求:
问题:
当前目录下的Example.mdb数据库(这个是Access数据库)中,内含一个数据表student,有三个字段:学号、姓名、密码,并有如干记录。连接串为string connStr="provider=microsoft.jet.oledb.4.0;datasource="+Server.MapPath("Example.mdb"),数据库对象不是SQL,而是Access,采用OleDb,即将对象前SQL换成OleDb。
1、编写一段程序,将student中的数据在DataGridl中显示出来。
2、编写一段程序,将学号、姓名、密码分别为0001,张山,abcd的学生记录插入到student中。
3、编写一段程序,判断数据库中是否存在学号为“01”、口令为“1234”的学生。
首先连接数据库(这里的链接字符串是在配置文件中)
static string connectionString = ConfigurationManager.ConnectionStrings["dbConnectionString"].ConnectionString;
private OleDbConnection connection;
public OleDbConnection Connection {
get{
if (connection == null){
connection = new OleDbConnection(connectionString);}
else if (connection.State == System.Data.ConnectionState.Closed) //关闭
{
connection.Open();}
else if (connection.State == System.Data.ConnectionState.Broken) //中断
{connection.Close();
connection.Open();}
return connection;
}
}
然后是执行查询语句和插入语句的方法;
/// <summary>
/// 执行SQL语句,返回影响的记录数
/// </summary>
/// <param name="SQLString">SQL语句</param>
/// <returns>影响的记录数</returns>
public static int ExecuteSql(string SQLString, params OleDbParameter[] cmdParms)
{
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
using (OleDbCommand cmd = new OleDbCommand())
{
try
{
PrepareCommand(cmd, connection, null, SQLString, cmdParms);
int rows = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return rows;
}
catch (System.Data.OleDb.OleDbException E)
{
throw new Exception(E.Message);
}
}
}
}
/// <summary>
/// 执行查询语句,返回OleDbDataReader
/// </summary>
/// <param name="strSQL">查询语句</param>
/// <returns>OleDbDataReader</returns>
public static OleDbDataReader ExecuteReader(string strSQL)
{
OleDbConnection connection = new OleDbConnection(connectionString);
OleDbCommand cmd = new OleDbCommand(strSQL, connection);
try
{
connection.Open();
OleDbDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return myReader;
}
catch (System.Data.OleDb.OleDbException e)
{
throw new Exception(e.Message);
}
}
下面是查询方法和插入方法
(由于时间问题,你把数据库字段都换成你自己的,我这里就不换了)
/// <summary>
/// 增加一条数据
/// </summary>
public int Add()
{
StringBuilder strSql=new StringBuilder();
strSql.Append("insert into [student](");
strSql.Append("[stNum],[Name],[Psd])");
strSql.Append(" values (");
strSql.Append("@stNum,@Name,@Psd)");
OleDbParameter[] parameters = {
new OleDbParameter("@stNum", OleDbType.VarChar,50),
new OleDbParameter("@Name", OleDbType.VarChar),
new OleDbParameter("@Psd", OleDbType.VarChar,50)};
parameters[0].Value = "0001";
parameters[1].Value = "张山";
parameters[2].Value = “abcd”;
int num=ExecuteCommand(strSql.ToString(),parameters);
return num;
}
/// <summary>
/// 得到所有对象
/// </summary>
/// <returns></returns>
public IList<Student> GetAll()
{
IList<Student> modelList = new List<Student>();
string sqlStr = "select * from [student] ORDER BY [Id] DESC";
using (OleDbDataReader reader = DbHelperOleDb.ExecuteReader(sqlStr))
{
while (reader.Read())
{
Student model = new Student();
if (reader["Id"].ToString() != "")
{
model.Id = int.Parse(reader["Id"].ToString());
}
model.stNum = reader["stNum"].ToString();
model.Name = reader["Name"].ToString();
model.Psd = reader["Psd"].ToString();
modelList.Add(model);
}
}
return modelList;
}
页面调用添加方法就可以添加一条记录了
下面市页面绑定数据
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataBindGV();
}
}
public void DataBindGV()
{
//GetAll()方法我是放在Student类里面的
gvStudentList.DataSource = new sutdent().GetAll();
gvStudentList.DataBind();
}
页面DataGrid的代码如下
<asp:GridView ID="gvStudentList" runat="server" BorderWidth="0px" BackColor="#999999"
CellPadding="1" CellSpacing="1" Width="100%"
AutoGenerateColumns="False">
<EmptyDataTemplate>
没有资料!
</EmptyDataTemplate>
<HeaderStyle Height="20px" BackColor="#CCCCCC" />
<FooterStyle />
<RowStyle BackColor="#fafafa" Height="20px" />
<EmptyDataRowStyle BackColor="#ffffff" />
<SelectedRowStyle />
<Columns>
<asp:BoundField DataField="Title" HeaderText="学号" SortExpression="stNum">
<ItemStyle Width="170px" />
</asp:BoundField>
<asp:TemplateField HeaderText="名称" SortExpression="Name">
<ItemTemplate>
<%#Eval("Name")) %>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="密码" SortExpression="Psd">
<ItemTemplate>
<%#Eval("Psd") %>
</ItemTemplate>
<ItemStyle Width="90px" />
</asp:TemplateField>
</Columns>
<PagerStyle BackColor="#eeeeee" BorderWidth="0" />
</asp:GridView>
关于第3个,只需把GetAll()方法的查询语句换一下就行了,换成如下语句:
select * from [student] where [stNum]='01' and [Psd]='1234'
然后再查询,根据查询的结果List判断是否存在,当然你也可以执行
select count(1) from [student] where [stNum]='01' and [Psd]='1234'
判断返回的数是否大于零就行了,当然这个查询要另外的查询语句才行用上面的查询方法不行了,需要执行ExecuteScalar()了,自己弄吧,很简单的
如此你的问题全都解决了
Ⅳ 如何在SQL Server中使用正则表达式
在T-SQL中使用正则表达式函数
有想过在T-Sql使用正则表达式吗?是的,完全可以的,我们可以用SQL SERVER CLR sql function来实现这一功能。
首先,我们在VSTS中创建一Database Project,增一个class, 实现下面的一个方法:
1: /// <summary>
2: /// Regs the ex match.
3: /// </summary>
4: /// <param name="inputValue">The input value.</param>
5: /// <param name="regexPattern">The regex pattern.</param>
6: /// <remarks>Author: Petter Liu http://wintersun.cnblogs.com </remarks>
7: /// <returns>1 match,0 not match</returns>
8: [SqlFunction]
9: public static bool RegExMatch(string inputValue, string regexPattern)
10: {
11: // Any nulls - we can't match, return false
12: if (string.IsNullOrEmpty(inputValue) || string.IsNullOrEmpty(regexPattern))
13: return false;
14:
15: Regex r1 = new Regex(regexPattern.TrimEnd(null));
16: return r1.Match(inputValue.TrimEnd(null)).Success;
17: }
好了,Build后Deploy到你的Target database就OK了,VisualStudio会自动注册这个程序集的。如果,你想手动注册程序集,可执行以下的T-SQL:
1: CREATE ASSEMBLY [RegExCLR] FROM 'RegExCLR.dll';
2:
3: -- Add the REGEX function. We want a friendly name
4: -- RegExMatch rather than the full namespace name.
5: -- Note the way we have to specify the Assembly.Namespace.Class.Function
6: -- NOTE the RegExCLR.RegExCLR
7: -- (one is the assembly the other is the namespace)
8: CREATE FUNCTION RegExMatch ( @inputCalue NVARCHAR(4000),
9: @regexPattern NVARCHAR(4000) ) RETURNS BIT
10: AS EXTERNAL NAME RegExCLR.RegExCLR.ClrClass.RegExMatch;
OK, 一切OK的后,我们来测试下:
select COUNT(1) from Threads where dbo.RegExMatch(ThreadId,'^[{|\(]?[0-9a-fA-F]{8}[-]?([0-9a-fA-F]{4}[-]?){3}[0-9a-fA-F]{12}[\)|}]?$')=1
上面的T-SQL是找出Threads表ThreadId是GUID的记录数。 等于1是匹配,^[{|\(]?[0-9a-fA-F]{8}[-]?([0-9a-fA-F]{4}[-]?){3}[0-9a-fA-F]{12}[\)|}]?$ 匹配GUID的正则表达式。
完了,希望这篇POST对您有帮助。
Ⅳ sql语句中怎么使用sum函数
sql 中的 sum 配合 case when 就可以添加条件 例 : sum(case when a >0 then a else 0 end ) 将 a列所以大于 0 的值相加。 sum(case when rq >'2015-1-1' and rq
Ⅵ 如何直接执行SQL语句
1、ExecuteQuery方法
看命名,我们很容易联想到ADO.NET里熟悉的Command的ExecuteNonQuery方法,但是VS的智能提示告诉我们这个方法返回的是一个泛型集合,应该“所思非所得”。下面通过一个简单方法,验证我们的猜想(数据库设计可以参考这一篇):
/// <summary>
/// 直接执行sql语句,获取总人数
/// </summary>
/// <returns></returns>
publicint GetTotalCount()
{
string strSql = "SELECT COUNT(0) FROM Person(NOLOCK)";
var query = dataContext.ExecuteQuery<int>(strSql);
int result = query.First<int>();
Console.WriteLine();
Console.WriteLine("total count:{0}", result);
return result;
}
调试的时候,通过IntelliTrace跟踪到:
毫无疑问,上面的图片说明最初的想法是不正确的,”ADO.NET:执行Reader…”云云,让我们更加坚信它实际执行的应该是ExecuteReader方法。当然最简单的方法是直接查看它的方法说明:
// 摘要:
// 直接对数据库执行 SQL 查询并返回对象。
//
// 参数:
// query:
// 要执行的 SQL 查询。
//
// parameters:
// 要传递给命令的参数数组。注意下面的行为:如果数组中的对象的数目小于命令字符串中已标识的最大数,
则会引发异常。如果数组包含未在命令字符串中引用的对象,则不会引发异常。如果某参数为
// null,则该参数会转换为 DBNull.Value。
//
// 类型参数:
// TResult:
// 返回的集合中的元素的类型。
//
// 返回结果:
// 由查询返回的对象的集合。
public IEnumerable<TResult> ExecuteQuery<TResult>(string query, paramsobject[] parameters);
ExecuteQuery方法还有一个非泛型方法:
//
// 摘要:
// 直接对数据库执行 SQL 查询。
//
// 参数:
// elementType:
//
要返回的 System.Collections.Generic.IEnumerable<T>
的类型。使查询结果中的列与对象中的字段或属性相匹配的算法如下所示:如果字段或属性映射到特定列名称,则结果集中应包含该列名称。如果未映射字段或属性,则结果集中应包含其名称与该字段或属性相同的列。通过先查找区分大小写的匹配来执行比较。如果未找到匹配项,则会继续搜索不区分大小写的匹配项。如果同时满足下列所有条件,则该查询应当返回(除延迟加载的对象外的)对象的所有跟踪的字段和属性:T
// 是由 System.Data.Linq.DataContext 显式跟踪的实体。
System.Data.Linq.DataContext.ObjectTrackingEnabled
// 为 true。实体具有主键。否则会引发异常。
//
// query:
// 要执行的 SQL 查询。
//
// parameters:
// 要传递给命令的参数数组。注意下面的行为:如果数组中的对象的数目小于命令字符串中已标识的最大数,
则会引发异常。如果数组包含未在命令字符串中引用的对象,则不会引发异常。如果某参数为
// null,则该参数会转换为 DBNull.Value。
//
// 返回结果:
// 由查询返回的对象的 System.Collections.Generic.IEnumerable<T> 集合。
public IEnumerable ExecuteQuery(Type elementType, string query, paramsobject[] parameters);
看它的参数需要多传递一个elementType,明显不如泛型方法简洁。
2、ExecuteCommand方法
同样道理,这个方法立刻让我们联想到(世界没有联想,生活将会怎样?),联想到,等等,不知联想到什么。然后我们看一下方法使用说明:
//
// 摘要:
// 直接对数据库执行 SQL 命令。
//
// 参数:
// command:
// 要执行的 SQL 命令。
//
// parameters:
// 要传递给命令的参数数组。注意下面的行为:如果数组中的对象的数目小于命令字符串中已标识的最大数,
则会引发异常。如果数组包含未在命令字符串中引用的对象,则不会引发异常。如果任一参数为
// null,则该参数会转换为 DBNull.Value。
//
// 返回结果:
// 一个 int,表示所执行命令修改的行数。
publicint ExecuteCommand(string command, paramsobject[] parameters);
到这里,看它的返回类型为int,表示执行命令修改的行数,这次很容易想到ExecuteNonQuery方法。对不对呢?通过下面的代码证明我们的设想:
/// <summary>
/// 直接执行sql语句 根据用户Id更新体重
/// </summary>
/// <param name="id">用户Id</param>
/// <param name="destWeight">更新后的体重</param>
/// <returns></returns>
publicint ModifyWeightById(int id, double destWeight)
{
string strSql = string.Format("UPDATE Person SET Weight={0} WHERE Id={1}", destWeight, id);
int result = dataContext.ExecuteCommand(strSql);
Console.WriteLine();
Console.WriteLine("affect num:{0}", result);
return result;
}
调试过程中,通过IntelliTrace可以很清楚地捕获:“ADO.NET:执行NonQuery…”基本可以断言我们的设想是正确的。
3、防止sql注入
1和2中,执行sql语句的两个方法都有一个params 类型的参数,我们又会想到ADO.NET非常重要的sql语句的参数化防止sql注入问题。下面通过一个方法,看看linq2sql可不可以防止sql注入。
(1)、直接执行拼接的sql语句(有风险)
/// <summary>
/// 直接执行sql语句 根据用户Id更新FirstName
/// </summary>
/// <param name="id">用户Id</param>
/// <param name="destName">更新后的FirstName</param>
/// <returns></returns>
publicint ModifyNameById(int id, string destName)
{
string strSql = string.Format("UPDATE Person SET FirstName='{0}' WHERE Id={1}", destName, id);
//这么拼接有风险
int result = dataContext.ExecuteCommand(strSql);
Console.WriteLine();
Console.WriteLine("affect num:{0}", result);
return result;
}
然后,在客户端这样调用这个方法:
int result = ServiceFactory.CreatePersonService().ModifyNameById(10, "'Anders'");
//更新id为10的人的FirstName
Ⅶ 如何用sql语句 实现分页查询
适用于 SQL Server 2000/2005
SELECT TOP 页大小 *
FROM table1
WHERE id NOT IN
SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
Ⅷ 在ms sql中如何使用正则表达式,请给出简单示例,注释越详细越好!感激不尽
MSSQL不支持正则表达式,可以用CLR实现。
1、新建一个MSSQL的数据库项目,配置到你的数据库中
2、在数据库项目中新建一个函数库,编写如下代码:
///<summary>
///验证是否符合正则表达式
///</summary>
[SqlFunction]
(stringinput,stringregex)
{
returnnewSqlBoolean(Regex.IsMatch(input,regex,RegexOptions.IgnoreCase));
}
然后在数据库项目上点击“右键”,选择“部署”
PS:此功能需要MSSQL2005或者以上版本支持
如果你使用的是.NET3.5版本的话,需要在数据库服务器上安装.netframework3.5
目前SQLSERVERCLR不支持.NET4.0,所以如果你使用VS2010开发的话需要把项目版本修改成为.NET2.0/3.5
使用方法:
SELECT*FROM[table]WHEREdbo.RegexIsMatch([ID],'^d+$')=1