
1、选择要 *** 作的数据库。
2、依次选择“表”-“查询”。
3、单击创建查询按钮。
4、在如下的查询编辑器中输入要执行的sql语句。
5、输入完成后单击运行按钮执行语句。
6、语句执行的信息、状态、及概况可以在下面查看
1、ExecuteQuery方法
看命名,我们很容易联想到ADONET里熟悉的Command的ExecuteNonQuery方法,但是VS的智能提示告诉我们这个方法返回的是一个泛型集合,应该“所思非所得”。下面通过一个简单方法,验证我们的猜想(数据库设计可以参考这一篇):
/// <summary>
/// 直接执行sql语句,获取总人数
/// </summary>
/// <returns></returns>
publicint GetTotalCount()
{
string strSql = "SELECT COUNT(0) FROM Person(NOLOCK)";
var query = dataContextExecuteQuery<int>(strSql);
int result = queryFirst<int>();
ConsoleWriteLine();
ConsoleWriteLine("total count:{0}", result);
return result;
}
调试的时候,通过IntelliTrace跟踪到:
毫无疑问,上面的说明最初的想法是不正确的,”ADONET:执行Reader…”云云,让我们更加坚信它实际执行的应该是ExecuteReader方法。当然最简单的方法是直接查看它的方法说明:
// 摘要:
// 直接对数据库执行 SQL 查询并返回对象。
//
// 参数:
// query:
// 要执行的 SQL 查询。
//
// parameters:
// 要传递给命令的参数数组。注意下面的行为:如果数组中的对象的数目小于命令字符串中已标识的最大数,
则会引发异常。如果数组包含未在命令字符串中引用的对象,则不会引发异常。如果某参数为
// null,则该参数会转换为 DBNullValue。
//
// 类型参数:
// TResult:
// 返回的集合中的元素的类型。
//
// 返回结果:
// 由查询返回的对象的集合。
public IEnumerable<TResult> ExecuteQuery<TResult>(string query, paramsobject[] parameters);
ExecuteQuery方法还有一个非泛型方法:
//
// 摘要:
// 直接对数据库执行 SQL 查询。
//
// 参数:
// elementType:
//
要返回的 SystemCollectionsGenericIEnumerable<T>
的类型。使查询结果中的列与对象中的字段或属性相匹配的算法如下所示:如果字段或属性映射到特定列名称,则结果集中应包含该列名称。如果未映射字段或属性,则结果集中应包含其名称与该字段或属性相同的列。通过先查找区分大小写的匹配来执行比较。如果未找到匹配项,则会继续搜索不区分大小写的匹配项。如果同时满足下列所有条件,则该查询应当返回(除延迟加载的对象外的)对象的所有跟踪的字段和属性:T
// 是由 SystemDataLinqDataContext 显式跟踪的实体。
SystemDataLinqDataContextObjectTrackingEnabled
// 为 true。实体具有主键。否则会引发异常。
//
// query:
// 要执行的 SQL 查询。
//
// parameters:
// 要传递给命令的参数数组。注意下面的行为:如果数组中的对象的数目小于命令字符串中已标识的最大数,
则会引发异常。如果数组包含未在命令字符串中引用的对象,则不会引发异常。如果某参数为
// null,则该参数会转换为 DBNullValue。
//
// 返回结果:
// 由查询返回的对象的 SystemCollectionsGenericIEnumerable<T> 集合。
public IEnumerable ExecuteQuery(Type elementType, string query, paramsobject[] parameters);
看它的参数需要多传递一个elementType,明显不如泛型方法简洁。
2、ExecuteCommand方法
同样道理,这个方法立刻让我们联想到(世界没有联想,生活将会怎样?),联想到,等等,不知联想到什么。然后我们看一下方法使用说明:
//
// 摘要:
// 直接对数据库执行 SQL 命令。
//
// 参数:
// command:
// 要执行的 SQL 命令。
//
// parameters:
// 要传递给命令的参数数组。注意下面的行为:如果数组中的对象的数目小于命令字符串中已标识的最大数,
则会引发异常。如果数组包含未在命令字符串中引用的对象,则不会引发异常。如果任一参数为
// null,则该参数会转换为 DBNullValue。
//
// 返回结果:
// 一个 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 = stringFormat("UPDATE Person SET Weight={0} WHERE Id={1}", destWeight, id);
int result = dataContextExecuteCommand(strSql);
ConsoleWriteLine();
ConsoleWriteLine("affect num:{0}", result);
return result;
}
调试过程中,通过IntelliTrace可以很清楚地捕获:
“ADONET:执行NonQuery…”基本可以断言我们的设想是正确的。
3、防止sql注入
1和2中,执行sql语句的两个方法都有一个params 类型的参数,我们又会想到ADONET非常重要的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 = stringFormat("UPDATE Person SET FirstName='{0}' WHERE Id={1}", destName, id);
//这么拼接有风险
int result = dataContextExecuteCommand(strSql);
ConsoleWriteLine();
ConsoleWriteLine("affect num:{0}", result);
return result;
}
然后,在客户端这样调用这个方法:
int result = ServiceFactoryCreatePersonService()ModifyNameById(10, "'Anders'");
//更新id为10的人的FirstName
1、打开ACCESS数据库,找到右边的空数据,单击d出对话框,让你选择数据库保存的路径和名称,大家根据自己的实际情况保存吧,我这里使用默认的。
2、创建数据库完成后,会生成一个小窗口,在右侧的白色区域找到使用设计器创建表,因为做演示。
3、建了一个简单的学生表,完后之后CTRL+S保存,d出对话框,输入表名单击确定。
4、接下来在左侧灰色区域找到查询并单击,右侧白色区域会有两个链接,单击在设计视图中创建查询--选中表名添加--(代表所有字段),在标题栏上面右键--SQL视图。
5、写入你的SQL语句,写好之后CTRL+S保存,d出对话框--查询名称(随意)--确定,完后之后在右侧的白色区域会生成你刚才保存的SQL语句,找到名称后双击即可显示SQL执行结果。
以上就是关于SQL2008如何跟踪某台电脑的执行语句全部的内容,包括:SQL2008如何跟踪某台电脑的执行语句、如何直接执行SQL语句、Access2010中如何运行SQL执行SQL语句等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)