.NET 3.5,C#
我有一个带有"搜索"功能的网络应用程序.可搜索的一些字段是表中的第一类列,但其中一些实际上是XML数据类型中的嵌套字段.
以前,我构建了一个系统,用于为我的搜索动态构建SQL.我有一个很好的类层次结构,它构建了SQL表达式和条件语句.唯一的问题是SQL注入攻击不安全.
我正在阅读Rob Conery的优秀文章,该文章指出,如果永远不会枚举IQueryable结果,那么多个查询可以合并到服务器的单个TSQL查询中.这让我觉得我的动态搜索结构太复杂了 - 我只需要组合多个LINQ表达式.
例如(人为):
Author:
ID (int),
LastName (varchar(32)),
FirstName (varchar(32))
context.Author.Where(xx => xx.LastName == "Smith").Where(xx => xx.FirstName == "John")
Run Code Online (Sandbox Code Playgroud)
结果在以下查询中:
SELECT [t0].[ID], [t0].[LastName], [t0].[FirstName]
FROM [dbo].[Author] AS [t0]
WHERE ([t0].[LastName] = Smith) AND ([t0].[FirstName] = John)
Run Code Online (Sandbox Code Playgroud)
我意识到这可能是一个简单的动态查询生成的完美解决方案,可以安全地从SQL注入 - 我只是循环我的IQueryable结果并执行其他条件表达式来获得我的最终单执行表达式.
但是,我找不到对XML数据评估的任何支持.在TSQL中,为了从XML节点获取值,我们会做类似的事情
XMLField.value('(*:Root/*:CreatedAt)[1]', 'datetime') = getdate()
Run Code Online (Sandbox Code Playgroud)
但我找不到LINQ to SQL等同于创建此评估.有人存在吗?我知道我可以评估所有非XML条件的DB端,然后进行我的XML评估代码方面,但我的数据足够大,A)这是很多网络流量拖累性能和B)我会退出 - 如果我无法评估XML第一个DB端以排除某些结果集,则会出现内存异常.
想法?建议?
奖金问题 - 如果XML评估实际上是可能的DB方面,那么FLWOR支持呢?
我正在使用MS SQL Server 2005.与SQL引擎之间有区别
SELECT * FROM MyTable;
Run Code Online (Sandbox Code Playgroud)
和
SELECT ColA, ColB, ColC FROM MyTable;
Run Code Online (Sandbox Code Playgroud)
当ColA,ColB和ColC代表表格中的每一列时?
如果它们是相同的,那么为什么你应该使用第二个呢?我有一个对LINQ很重的项目,我不确定它生成的标准SELECT*是不是很糟糕,或者我应该总是使用.Select()来指定我想要的cols.
编辑:更改"当ColA,ColB和ColC是表格的所有列?" "当ColA,ColB和ColC代表表格中的每一列?" 为清楚起见.
SQL Server Server 2005.我正盯着一个拥有500多个存储过程的数据库,并试图收集它们如何与数据交互的复杂性 - 特别是关于它们如何插入/修改数据.我希望找到一个搜索"或"找到"查看实际过程内容的功能.这样,我可以搜索所有使用some_table_name执行任何操作的过程.SQL Management的基本查找功能Studio查看已打开的文件,如果我已经打开了sproc,则只在查找文件中查找内容,即使只有在...\Local Settings\Temp\~vs1011.sql临时类型文件中也是如此.
截至目前,我知道进入底层程序的唯一方法是右键单击并选择"修改"(或脚本存储过程为=>创建或更改).是否有更快/更简单的方法来搜索/检查所有的sprocs?
我正在尝试从C#,.NET 2.0调用存储过程(在SQL 2005服务器上)DateTime作为a的值SqlParameter.存储过程中的SQL类型是"datetime".
从SQL Management Studio执行sproc工作正常.但是每当我从C#调用它时,我都会收到有关日期格式的错误.
当我运行SQL事件探查器来监视调用时,我会复制粘贴exec调用以查看正在发生的事情.这些是我对我尝试过的观察和注意事项:
1)如果我DateTime直接作为a DateTime或转换为传入SqlDateTime,则该字段由单引号的PAIR包围,例如
@Date_Of_Birth=N''1/8/2009 8:06:17 PM''
Run Code Online (Sandbox Code Playgroud)
2)如果我将DateTimein作为字符串传递,我只得到单引号
3)使用SqlDateTime.ToSqlString()不会产生UTC格式的日期时间字符串(即使转换为通用时间后)
4)使用DateTime.ToString()不会产生UTC格式的日期时间字符串.
5)手动设置DbType为SqlParameterto DateTime不会改变上述观察结果.
那么,我的问题是,我是如何让C#通过正确格式化的时间SqlParameter?当然这是一个常见的用例,为什么这么难以开始工作?我似乎无法转换DateTime为SQL兼容的字符串(例如'2009-01-08T08:22:45')
编辑
RE:BFree,实际执行sproc的代码如下:
using (SqlCommand sprocCommand = new SqlCommand(sprocName))
{
sprocCommand.Connection = transaction.Connection;
sprocCommand.Transaction = transaction;
sprocCommand.CommandType = System.Data.CommandType.StoredProcedure;
sprocCommand.Parameters.AddRange(parameters.ToArray());
sprocCommand.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)
详细了解我的尝试:
parameters.Add(new SqlParameter("@Date_Of_Birth", DOB));
parameters.Add(new SqlParameter("@Date_Of_Birth", DOB.ToUniversalTime()));
parameters.Add(new SqlParameter("@Date_Of_Birth",
DOB.ToUniversalTime().ToString()));
SqlParameter param = new SqlParameter("@Date_Of_Birth", …Run Code Online (Sandbox Code Playgroud) jQuery可以返回最后一个或第一个孩子,它可以正常工作.
但我需要得到第二个孩子.
获取其文本时,此构造(通过索引获取子项)不起作用:
child.parent().parent().children().get(1).text()
Run Code Online (Sandbox Code Playgroud)
那么,我怎样才能找到非最后和非第一个孩子(例如第二个)?
如果我删除用于启动事件气泡的DOM元素,或者其子项启动事件气泡,我应该期待什么行为?如果元素被删除,它会继续冒泡吗?
例如 - 假设您有一个表,并希望检测表格单元格上的单击事件.JS的另一部分执行了一个AJAX请求,一旦请求完成,它将最终完全替换表.
如果我单击表格会立即在表格被成功完成AJAX请求取代后会发生什么?我问,因为我看到一些行为,其中点击事件似乎没有冒泡 - 但很难复制.
我正在观看桌子的父元素上的事件(而不是将事件附加到每个TD),并且它有时似乎没有达到它.
编辑:再次遇到这个问题,最后得到了它的根源.根本不是一个冒泡的问题!请参阅下面的答案了解详情.
可能重复:
为什么C#默认将方法实现为非虚方式?
我主要讲的是C#,.NET 3.5,但总体上想知道不考虑所有"虚拟"的好处是什么 - 也就是说在子类实例中调用的方法总是执行最多的子版本那种方法.在C#中,如果父方法未使用"虚拟"修饰符标记,则情况并非如此.例:
public class Parent
{
public void NonVirtual() { Console.WriteLine("Non-Virtual Parent"); }
public virtual void Virtual(){ Console.WriteLine("Virtual Parent"); }
}
public class Child : Parent
{
public new void NonVirtual() { Console.WriteLine("Non-Virtual Child"); }
public override void Virtual() { Console.WriteLine("Virtual Child"); }
}
public class Program
{
public static void Main(string[] args)
{
Child child = new Child();
Parent parent = new Child();
var anon = new Child();
child.NonVirtual(); // => Child
parent.NonVirtual(); // => …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Html.RenderPartial()呈现带有"MVC View User Control"的强类型视图.我的ascx文件的顶部如下所示:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.Collections.IEnumerable<string>>" %>
Run Code Online (Sandbox Code Playgroud)
目前,此页面上没有其他内容.
当我执行应用程序并加载呈现此控件的页面时,我收到以下错误:
Could not load type 'System.Web.Mvc.ViewUserControl<System.Collections.IEnumerable<string>>'.
Run Code Online (Sandbox Code Playgroud)
那么,我简化了它:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<String>" %>
Run Code Online (Sandbox Code Playgroud)
然后,以防万一需要完全合格:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.String>" %>
Run Code Online (Sandbox Code Playgroud)
每次我得到相同的错误(替换类型).我在这做错了什么?我在.NET 3.5上使用ASP.NET MVC 1.0 RTM.
我知道出于安全原因不允许跨域请求,但我的印象是只有顶级域名需要匹配,不同的子域名都可以.但是,我从Chrome 7收到此错误:
"不安全的JavaScript尝试与URL访问框架http://foo.somedomain.com/dir/page.html从框架与URL http://bar.somedomain.com/otherdir/otherpage.html.域,协议和端口必须比赛"
这些类型的请求的具体规则是什么?
WebWorker使用与传统JavaScript的"窗口"上下文完全分离的范围执行.是否有一种标准方法可以让脚本确定它本身是作为WebWorker执行的?
我能想到的第一个"黑客"是检测工人范围内是否存在"窗口"属性.如果不存在,这可能意味着我们正在作为WebWorker执行.
其他选项是检测标准"窗口"上下文中不存在的属性.对于Chrome 14,此列表目前包括:
FileReaderSync
FileException
WorkerLocation
importScripts
openDatabaseSync
webkitRequestFileSystemSync
webkitResolveLocalFileSystemSyncURL
Run Code Online (Sandbox Code Playgroud)
检测WorkerLocation似乎是一个可行的候选人,但这仍然感觉有点hackish.有没有更好的办法?
编辑:这是我用来确定执行WebWorker中现在位于"窗口"中的属性的JSFiddle.
.net-3.5 ×2
c# ×2
dom ×2
javascript ×2
linq-to-sql ×2
sql ×2
sql-server ×2
.net ×1
.net-2.0 ×1
ajax ×1
asp.net-mvc ×1
cross-domain ×1
database ×1
datetime ×1
html5 ×1
jquery ×1
linq ×1
overriding ×1
virtual ×1
web-worker ×1
xml ×1