精华内容
下载资源
问答
  • <!--google_ad_client = "pub-8333940862668978";/* 728x90, 创建于 08-11-30 */google_ad_slot = "4485230109";google_ad_width = 728;google_ad_height = 90;//--><script type="text/javascript"
    VB.NET源码-156个实用实例哦……
    
    <script type="text/javascript"
    src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
    </script>
    
    怎样使用参数查询
    如果想通过一张表的某一个字段查询出这张表的全部信息,并用datagrid显示出来,应该怎么做?有哪位高人能提供一段源代码例子给偶啊(偶的抽象思维很弱,一般要看到实例才理解得比较快,呵呵)
    __________________________________________________________________________
    “通过一张表的某一个字段查询出这张表的全部信息”是什么意思?
    __________________________________________________________________________
    写个存储过程不就行了
    imports system.data.sqlclient

    dim cnn as new sqlconnection
    dim dataset as new dataset

    cnn.connectionstring= "server=srvname;database=dbname;uid=sa;pwd= "
    cnn.open

    dim adapter as sqldataadapter=new (spname,cnn)
    dim pr as new sqlparameter

    pr.name= ''@item ''
    pr.dbtype=system.type.gettype( "System.string ")
    pr.type=input
    adapter.parameters.add(pr)

    adapter.fill(dataset)
    datagrid1.datasource=dataset.table(0)
    __________________________________________________________________________
    楼主问题更抽象哦
    看不懂啊。
    是用一个字段还是用多个字段?
    __________________________________________________________________________
    说不清,何以道明?
    __________________________________________________________________________
    应该就是加条件吧,条件是有一个字段限定的。
    那存储过程怎么加到代码里呢?
    __________________________________________________________________________
    ado.net + sql 应该就是这样的:

    Imports System.Data
    Imports System.Data.OleDb
    Public Class Form1
    Dim conn As New OleDbConnection
    Dim connstr, sql As String
    Dim cmd As OleDbCommand
    Dim da As New OleDbDataAdapter
    Dim tbl As New DataTable

    Private Sub Conn_DB()
    connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & Application.StartupPath & "/123.mdb "
    conn.ConnectionString = connstr
    Try
    conn.Open()
    Catch ex As Exception
    MsgBox(ex.Message)
    End Try
    End Sub

    Private Sub DoQuery()
    Dim Insql As String
    If conn.State = ConnectionState.Closed Then Conn_DB()
    sql = "select * from mydata where "
    Insql = "f1 like ''% " & TextBox1.Text & "% '' "
    sql &= Insql
    Insql = "and f2 like ''% " & TextBox2.Text & "% '' "
    sql &= Insql
    Insql = "and f3 like ''% " & TextBox3.Text & "% '' "
    sql &= Insql
    cmd = New OleDbCommand(sql, conn)
    da.SelectCommand = cmd
    tbl.Clear()
    da.Fill(tbl)
    DataGridView1.DataSource = tbl
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    conn.Close()
    conn.Dispose()
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    DoQuery()
    End Sub

    Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    If Convert.ToInt32(e.KeyChar) = 13 Then
    TextBox2.Focus()
    TextBox2.SelectAll()
    End If

    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    DoQuery()
    End Sub

    Private Sub TextBox2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox2.KeyPress
    If Convert.ToInt32(e.KeyChar) = 13 Then
    TextBox3.Focus()
    TextBox3.SelectAll()
    End If
    End Sub

    Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
    DoQuery()
    End Sub

    Private Sub TextBox3_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox3.KeyPress
    If Convert.ToInt32(e.KeyChar) = 13 Then
    TextBox1.Focus()
    TextBox1.SelectAll()
    End If
    End Sub

    Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged
    DoQuery()
    End Sub
    End Class


    简单的做了个多字段的查询,显示控件使用datagridview ,你看看吧
    __________________________________________________________________________
    在前台程序中,使用参数化查询,如:
    strMsg = "EXEC sp_executesql " _
    & "N''SELECT UserCode,UserName,[Password]库FROM RB_Users WHERE UserCode=@P1''," _
    & "N''@P1 NVARCHAR(30)'',@P1=''" & sLoginName & "''"
    Con.Execute strMsg,lAffected

    !Con为已打开的连接,lAffected为接收受此查询影响的行数.
    __________________________________________________________________________
    展开全文
  • SQL Server 2008 参数查询

    千次阅读 2011-02-09 22:30:00
    我将讨论如果一个查询可以被参数化,那么SQL Server优化器怎样尝试将其参数化,...有两种不同的方式来创建参数查询.第一个方式是让查询优化器自动地参数化你的查询.另一个方式是通过以一个特定方式来编写你的T-SQL代码

    我将讨论如果一个查询可以被参数化,那么SQL Server优化器怎样尝试将其参数化,以及你可以怎样建立你自己的参数化查询.

    1.什么是参数化查询?

    一个简单理解参数化查询的方式是把它看做只是一个T-SQL查询,它接受控制这个查询返回什么的参数.通过使用不同的参数,一个参数化查询返回不同的结果.要获得一个参数化查询,你需要以一种特定的方式来编写你的代码,或它需要满足一组特定的标准.

    有两种不同的方式来创建参数化查询.第一个方式是让查询优化器自动地参数化你的查询.另一个方式是通过以一个特定方式来编写你的T-SQL代码,并将它传递给sp_executesql系统存储过程,从而编程一个参数化查询.这篇文章的后面部分将介绍这个方法.

    参数化查询的关键是查询优化器将创建一个可以重用的缓存计划.通过自动地或编程使用参数化查询,SQL Server可以优化类似T-SQL语句的处理.这个优化消除了对使用高贵资源为这些类似T-SQL语句的每一次执行创建一个缓存计划的需求.而且通过创建一个可重用计划,SQL Server还减少了存放过程缓存中类似的执行计划所需的内存使用.

    2.现在让我们看看使得SQL Server创建参数化查询的不同方式.

    参数化查询是怎样自动创建的?

    微软编写查询优化器代码的人竭尽全力地优化SQL Server处理你的T-SQL命令的方式.我想这是查询优化器名称的由来.这些尽量减少资源和最大限度地提高查询优化器执行性能的方法之一是查看一个T-SQL语句并确定它们是否可以被参数化.要了解这是如何工作的,让我们看看下面的T-SQL语句:

    SELECT * FROM AdventureWorks.Sales.SalesOrderHeader

    WHERE SalesOrderID = 56000;

    GO

    在这里,你可以看到这个命令有两个特点.第一它简单,第二它在WHERE谓词中包含一个用于SalesOrderID值的指定值.查询优化器可以识别这个查询比较简单以及SalesOrderID有一个参数("56000").因此,查询优化器可以自动地参数化这个查询.

    如果你使用下面的SELECT语句来查看一个只包含用于上面语句的缓存计划的,干净的缓冲池,那么你会看到查询优化器将T-SQL查询重写为一个参数化T-SQL语句:

    SELECT stats.execution_count AS cnt, p.size_in_bytes AS [size], [sql].[text] AS [plan_text]

    FROM sys.dm_exec_cached_plans p

    OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql

    JOIN sys.dm_exec_query_stats stats ON stats.plan_handle = p.plan_handle

    GO

    当我在一个SQL Server 2008实例上运行这个命令时,我得到下面的输出,(注意,输出被重新格式化了,以便它更易读):

    如果你看看上面输出中的plan_text字段,你会看到它不像原来的T-SQL文本.如前所述,查询优化器将这个查询重新编写为一个参数化T-SQL语句.在这里,你可以看到它现在有一个数据类型为(int)的变量(@1),它在之前的SELECT语句中被定义的.另外在plan_text的末尾,"56000"被替换为变量@1.既然这个T-SQL语句被重写了,而且被存储为一个缓存计划,那么如果未来一个T-SQL命令和它大致相同,只有SalesOrderID字段被赋的值不同的话,它就可以被用于重用.让我们在动作中看看它.

    如果我在我的机器上运行下面的命令:

    DBCC FREEPROCCACHE

    GO

    SELECT * FROM AdventureWorks.Sales.SalesOrderHeader

    WHERE SalesOrderID = 56000;

    GO

    SELECT * FROM AdventureWorks.Sales.SalesOrderHeader

    WHERE SalesOrderID = 56001;

    GO

    SELECT stats.execution_count AS cnt, p.size_in_bytes AS [size], [sql].[text] AS [plan_text]

    FROM sys.dm_exec_cached_plans p

    OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql

    JOIN sys.dm_exec_query_stats stats ON stats.plan_handle = p.plan_handle

    GO

    我从最后的SELECT语句得到下面的输出,(注意,输出被重新格式化以便它更易读):

    在这里,我首先释放过程缓存,然后我执行两个不同、但却类似的非参数化查询来看看查询优化器是会创建两个不同的缓存计划还是创建用于这两个查询的一个缓存计划.在这里,你可以看到查询优化器事实上很聪明,它参数化第一个查询并缓存了计划.然后当第二个类似、但有一个不同的SalesOrderID值的查询发送到SQL Server,优化器可以识别已经缓存了一个计划,然后重用它来处理第二个查询.你可以这么说是因为"cnt"字段现在表明这个计划被用了两次.

    3.数据库配置选项PARAMETERIZATION可以影响T-SQL语句怎样被自动地参数化.对于这个选项有两种不同的设置,SIMPLEFORCED.PARAMETERIZATION设置被设置为SIMPLE,只有简单的T-SQL语句才会被参数化.要介绍这个,看下下面的命令:

    SELECT SUM(LineTotal) AS LineTotal

    FROM AdventureWorks.Sales.SalesOrderHeader H

    JOIN AdventureWorks.Sales.SalesOrderDetail D ON D.SalesOrderID = H.SalesOrderID

    WHERE H.SalesOrderID = 56000

    这个查询类似于我前面的示例,除了在这里我添加了一个额外的JOIN标准.当数据库AdventureWorksPARAMETERIZATION选项被设置为SIMPLE,这个查询不会被自动地参数化.SIMPLE PARAMETERIZATION设置告诉查询优化器只参数化简单的查询.但是当选项PARAMETERIZATION被设置为FORCED,这个查询将被自动地参数化.

    当你设置数据库选项为使用FORCE PARAMETERIZATION,查询优化器试图参数化所有的查询,而不仅仅是简单的查询.你可能会认为这很好.但是在某些情况下,当数据库设置PARAMETERIZATIONFORCED,查询优化器将选择不是很理想的查询计划.当数据库设置PARAMETERFORCED,它改变查询中的字面常量.这可能导致当查询中涉及计算字段时索引和索引视图不被选中参与到执行计划中,从而导致一个无效的计划.FORCED PARAMETERIZATION选项可能是改进具有大量类似的、传递过来的参数稍有不同的查询的数据库性能的一个很好的解决方案.一个在线销售应用程序,它的客户对你的产品执行大量的类似搜索, 产品值不同,这可能是一个能够受益于FORCED PARAMETERIZATION的很好的应用程序类型.

    不是所有的查询从句都会被参数化.例如查询的TOPTABLESAMPLE HAVINGGROUP BYORDER BYOUTPUT...INTOFOR XML从句不会被参数化.

    4.使用sp_execute_sql来参数化你的T-SQL

    你不需要依赖于数据库的PARAMETERIZATION选项来使得查询优化器参数化一个查询.你可以参数化你自己的查询.你通过重新编写你的T-SQL语句并使用”sp_executesql”系统存储过程执行重写的语句来实现.正如已经看到的,上面包括一个"JOIN"从句的SELECT语句在数据库的PARAMETERIZATION设置为SIMPLE时没有被自动参数化.让我重新编写这个查询以便查询优化器将创建一个可重用的参数化查询执行计划.

    为了说明,让我们看两个类似的、不会被自动参数化的T-SQL语句,并创建两个不同的缓存执行计划.然后我将重新编写这两个查询使得它们都使用相同的缓存参数化执行计划.

    让我们看看这个代码:

    DBCC FREEPROCCACHE

    GO

    SELECT SUM(LineTotal) AS LineTotal

    FROM AdventureWorks.Sales.SalesOrderHeader H

    JOIN AdventureWorks.Sales.SalesOrderDetail D ON D.SalesOrderID = H.SalesOrderID

    WHERE H.SalesOrderID = 56000

    GO

    SELECT SUM(LineTotal) AS LineTotal

    FROM AdventureWorks.Sales.SalesOrderHeader H

    JOIN AdventureWorks.Sales.SalesOrderDetail D ON D.SalesOrderID = H.SalesOrderID

    WHERE H.SalesOrderID = 56001

    GO

    SELECT stats.execution_count AS cnt, p.size_in_bytes AS [size], [sql].[text] AS [plan_text]

    FROM sys.dm_exec_cached_plans p

    OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql

    JOIN sys.dm_exec_query_stats stats ON stats.plan_handle = p.plan_handle

    GO

    在这里,我释放了过程缓存,然后运行这两个包含一个JOIN的、不同的非简单的T-SQL语句.然后我将检查缓存计划.这是这个使用DMV SELECT语句的输出(注意,输出被重新格式化了,以便它更易读):

    正如你从这个输出看到的,这两个SELECT语句没有被查询优化器参数化.优化器创建了两个不同的缓存执行计划,每一个都只被执行了一次.我们可以通过使用sp_executesql系统存储过程来帮助优化器为这两个不同的SELECT语句创建一个参数化执行计划.

    下面是上面的代码被重新编写来使用sp_executesql 系统存储过程:

    DBCC FREEPROCCACHE

    GO

    EXEC sp_executesql N'SELECT SUM(LineTotal) AS LineTotal

    FROM AdventureWorks.Sales.SalesOrderHeader H

    JOIN AdventureWorks.Sales.SalesOrderDetail D ON D.SalesOrderID = H.SalesOrderID

    WHERE H.SalesOrderID = @SalesOrderID', N'@SalesOrderID INT', @SalesOrderID = 56000

    GO

    EXEC sp_executesql N'SELECT SUM(LineTotal) AS LineTotal

    FROM AdventureWorks.Sales.SalesOrderHeader H

    JOIN AdventureWorks.Sales.SalesOrderDetail D ON D.SalesOrderID = H.SalesOrderID

    WHERE H.SalesOrderID = @SalesOrderID', N'@SalesOrderID INT', @SalesOrderID = 56001

    GO

    SELECT stats.execution_count AS cnt, p.size_in_bytes AS [size], [sql].[text] AS [plan_text]

    FROM sys.dm_exec_cached_plans p

    OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql

    JOIN sys.dm_exec_query_stats stats ON stats.plan_handle = p.plan_handle

    GO

    如同你所看到的,我重新编写了这两个SELECT语句,使它们通过使用”EXEC sp_executesql”语句来执行.对这些EXEC语句中的每一个,我都传递三个不同的参数.第一个参数是基本的SELECT语句,但是我将SalesOrderID的值用一个变量(@SalesOrderID)替代.在第二个参数中,我确定了@SalesOrderID的数据类型,在这个例子中它是一个integer.然后在最后一个参数中,我传递了SalesOrderID的值.这个参数将控制我的SELECT根据SalesOrderID值所生成的结果.sp_executesql的每次执行中前两个参数都是一样的.但是第三个参数不同,因为每个都有不同的SalesOrderID.

    现在当我运行上面的代码时,我从DMV SELECT语句得到下面的输出(注意,输出被重新格式化了,以便它更易读):

    从这个输出,你可以看出,我有一个参数化缓存计划,它被执行了两次,为每个EXEC语句各执行了一次.

    使用参数化查询来节省资源和优化性能

    在语句可以被执行之前,每个T-SQL语句都需要被评估,而且需要建立一个执行计划.创建执行计划会占用宝贵的CPU资源.当执行计划被创建后,它使用内存空间将它存储在过程缓存中.降低CPU和内存使用的一个方法是利用参数化查询.尽管数据库可以被设置为对所有查询FORCE参数化,但是这不总是最好的选择.通过了解你的哪些T-SQL语句可以被参数化然后使用sp_executesql存储过程,你可以帮助SQL Server节省资源并优化你的查询的性能.

    展开全文
  • 该函数是在打开文件的基础上操作的,用于查询文件的信息,《内核文件管理-IRP(一)创建或打开文件》中实现的 IrpCreateFile 函数成功打开文件后返回的 文件句柄 ,这里将作为参数传入 IrpQueryInformationFile 函数。...

    本文讲怎样通过向 FSD 发送 IRP_MJ_QUERY_INFORMATION 消息 / IRP_MJ_SET_INFORMATION 消息的 IRP 来 查询/设置 文件属性。
    上一篇:内核文件管理-IRP(一)创建或打开文件

    IrpQueryInformationFile函数参数

    该函数是在打开文件的基础上操作的,用于查询文件的信息,上一篇 内核文件管理-IRP(一)创建或打开文件 中实现的 IrpCreateFile 函数成功打开文件后返回的 文件句柄 ,这里将作为参数传入 IrpQueryInformationFile 函数。

    NTSTATUS IrpQueryInformationFile(
    	IN	PFILE_OBJECT pFileObject,						// 文件句柄
    	OUT PIO_STATUS_BLOCK IoStatusBlock,					// 用于返回最终完成的状态和其他请求操作的信息
    	OUT	PVOID FileInformation,							// 返回的文件信息
    	IN	ULONG Length,									// FileInformation结构的长度
    	IN	FILE_INFORMATION_CLASS FileInformationClass);	// FileInformatino的类型
    

    IrpQueryInformationFile实现

    变量定义略,具体参见源代码

    1.判断传入的参数,然后获得设备对象

    if (NULL == pFileObject)
    	{
    		return STATUS_UNSUCCESSFUL;
    	}
    	if (NULL == pFileObject->Vpb)
    	{
    		return STATUS_UNSUCCESSFUL;
    	}
    	pDevObj = pFileObject->Vpb->DeviceObject;	// 由文件对象中的VPB得到
    	if (NULL == pDevObj)
    	{
    		return STATUS_UNSUCCESSFUL;
    	}
    

    2.创建IRP和等待IRP处理完成的事件

    根据设备对象的栈大小创建IRP,然后创建事件用于通知IRP的处理完成。

    	pIRP = IoAllocateIrp(pDevObj->StackSize, FALSE);
    	if (NULL == pIRP)
    	{
    		return STATUS_UNSUCCESSFUL;
    	}
    	KeInitializeEvent(&kEvent, SynchronizationEvent, FALSE);
    

    3.设置IRP

    	RtlZeroMemory(FileInformation, Length);
    	pIRP->UserEvent = &kEvent;
    	pIRP->UserIosb = IoStatusBlock;
    	pIRP->AssociatedIrp.SystemBuffer = FileInformation;
    	pIRP->RequestorMode = KernelMode;
    	pIRP->Tail.Overlay.Thread = PsGetCurrentThread();
    	pIRP->Tail.Overlay.OriginalFileObject = pFileObject;
    

    4.获取下一个IRP的IO_STACK_LOCATION并设置

    这里设置 IRP_MJ_QUERY_INFORMATION 等信息。

    	pIoStackLocation = IoGetNextIrpStackLocation(pIRP);
    	pIoStackLocation->MajorFunction = IRP_MJ_QUERY_INFORMATION;
    	pIoStackLocation->DeviceObject = pDevObj;
    	pIoStackLocation->FileObject = pFileObject;
    	pIoStackLocation->Parameters.QueryFile.Length = Length;
    	pIoStackLocation->Parameters.QueryFile.FileInformationClass = FileInformationClass;
    

    5.设置完成实例

    	IoSetCompletionRoutine(pIRP, CompleteRoutine, NULL, TRUE, TRUE, TRUE);
    

    CompleteRoutine 函数与上一篇《内核文件管理-IRP(一)创建或打开文件》中的 CompleteRoutine 函数相同。

    6.发送IRP,等待处理完成并返回结果

    	// 发送IRP
    	status = IoCallDriver(pDevObj, pIRP);
    	// 等待IRP处理完成
    	if (STATUS_PENDING == status)
    	{
    		KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, NULL);
    	}
    	// 返回执行结果
    	return IoStatusBlock->Status;
    

    成功的话,要求的文件信息将保存到传入参数 PVOID FileInformation 中。

    IrpSetInformationFile函数参数

    该函数也是在打开文件的基础上操作的,用于设置文件属性。其参数和实现基本与IrpQueryInformationFile函数相同,区别仅仅在于 IRP下一个IRP的IO_STACK_LOCATION 的设置,本文仅展示该设置,不再多说。

    	NTSTATUS IrpSetInformationFile(
    	IN	PFILE_OBJECT pFileObject,						// 文件句柄
    	OUT PIO_STATUS_BLOCK IoStatusBlock,					// 用于返回最终完成的状态和其他请求操作的信息
    	IN	PVOID FileInformation,							// 设置的文件信息
    	IN	ULONG Length,									// FileInformation结构的长度
    	IN	FILE_INFORMATION_CLASS FileInformationClass);	// FileInformatino的类型
    

    IrpSetInformationFile设置

    变量定义略,具体参见源代码

    IRP设置

    	pIRP->UserEvent = &kEvent;
    	pIRP->UserIosb = IoStatusBlock;
    	pIRP->AssociatedIrp.SystemBuffer = FileInformation;	// 这里FileInformation是传入的,所以没有RtlZeroMemory
    	pIRP->RequestorMode = KernelMode;
    	pIRP->Tail.Overlay.Thread = PsGetCurrentThread();
    	pIRP->Tail.Overlay.OriginalFileObject = pFileObject;
    

    下一个IRP的IO_STACK_LOCATION 的设置

    这里不同设置为 IRP_MJ_SET_INFORMATION ,以及设置的参数为 SetFile 。

    	pIoStackLocation = IoGetNextIrpStackLocation(pIRP);
    	pIoStackLocation->MajorFunction = IRP_MJ_SET_INFORMATION;
    	pIoStackLocation->DeviceObject = pDevObj;
    	pIoStackLocation->FileObject = pFileObject;
    	pIoStackLocation->Parameters.SetFile.Length = Length;
    	pIoStackLocation->Parameters.SetFile.FileInformationClass = FileInformationClass;
    

    例子

    以下代码获取了文件 C:\Hello\test.txt 的大小:

    	NTSTATUS status = STATUS_SUCCESS;
    		UNICODE_STRING ustrOpenFile;
    		RtlInitUnicodeString(&ustrOpenFile, L"C:\\Hello\\test.txt");
    		PFILE_OBJECT hFile = NULL;
    		IO_STATUS_BLOCK iosb = { 0 };
    		status = IrpCreateFile(&hFile, GENERIC_READ, &ustrOpenFile,
    			&iosb, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ,
    			FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
    		if (!NT_SUCCESS(status))
    		{
    			DbgPrint("[ERROR]   IrpCreateFile: 打开文件\n");
    			return;
    		}
    		DbgPrint("[SUCCESS] IrpCreateFile: 打开文件\n");
    		FILE_STANDARD_INFORMATION fsi = { 0 };
    		status = IrpQueryInformationFile(hFile, &iosb, &fsi, sizeof(fsi), FileStandardInformation);
    		if (!NT_SUCCESS(status))
    		{
    			DbgPrint("[ERROR]   IrpQueryInformationFile: 获取文件信息\n");
    			ObDereferenceObject(hFile);
    			return;
    		}
    		ObDereferenceObject(hFile);
    		DbgPrint("[SUCCESS] IrpQueryInformationFile: 文件大小 %I64d\n", fsi.EndOfFile.QuadPart);
    

    以下代码设置了文件 C:\Hello\test.txt 属性为 系统 | 隐藏:(即使在文件资源管理器中查看隐藏文件也无法看见)

    	NTSTATUS status = STATUS_SUCCESS;
    		UNICODE_STRING ustrOpenFile;
    		RtlInitUnicodeString(&ustrOpenFile, L"C:\\Hello\\test.txt");
    		PFILE_OBJECT hFile = NULL;
    		IO_STATUS_BLOCK iosb = { 0 };
    		status = IrpCreateFile(&hFile, GENERIC_READ | GENERIC_WRITE, &ustrOpenFile,
    			&iosb, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
    			FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
    		if (!NT_SUCCESS(status))
    		{
    			DbgPrint("[ERROR]   IrpCreateFile: 打开文件\n");
    			return;
    		}
    		DbgPrint("[SUCCESS] IrpCreateFile: 打开文件\n");
    		FILE_BASIC_INFORMATION fileBaseInfo = { 0 };
    		RtlZeroMemory(&fileBaseInfo, sizeof(fileBaseInfo));
    		fileBaseInfo.FileAttributes = FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN;
    		status = IrpSetInformationFile(hFile, &iosb, &fileBaseInfo, sizeof(fileBaseInfo), FileBasicInformation);
    		if (!NT_SUCCESS(status))
    		{
    			DbgPrint("[ERROR]   IrpSetInformationFile: 设置文件属性\n");
    			ObDereferenceObject(hFile);
    			return;
    		}
    		ObDereferenceObject(hFile);
    		DbgPrint("[SUCCESS] IrpSetInformationFile: 设置文件属性\n");
    

    下一篇:内核文件管理-IRP(三)文件读写

    展开全文
  • HQL的全称是? 和SQL相比,HQL有哪些特点? HQL语句为:select jd.jdid,jd.jd from TblJd jd。怎样获得并显示查询结果? 使用'?'做占位符的参数查询,怎样设置参数的值?...怎样创建Criteria查询对象?
  • 代码在下面已经给出 2 种方式查询到的结果一样,那么QueryRunner的无connection是怎样获得连接的??? //需要用到的工具类 public class DBCPUtils { private static DataSource dataSource; static{ ...
  • 我这边有一个需求要统计订单数据,需要统计订单的上传日期,统计的模块大概是 那么上月、上周、昨天、今天、本周、本月应该是怎样呢? 1、数据分析 因为今天是动态数据,我要查月份(上月...创建一个有输入参数和输...

    我这边有一个需求要统计订单数据,需要统计订单的上传日期,统计的模块大概是

    那么上月、上周、昨天、今天、本周、本月应该是怎样呢?

    1、数据分析

    因为今天是动态数据,我要查月份(上月、本月),应该是一个日期范围(开始日期到结束日期)

    要查周期(上周、本周),是星期一到星期天,要转化为日期范围

    这样,将上月、上周、昨天、今天、本周、本月这些作为一个参数,我们来查询对应的日期范围。创建一个有输入参数和输出参数的存储过程,通过输入参数(周期类型)获取输出参数(日期范围

    2、创建存储过程

    --存储过程语法--
    create proc sp_GetDateCycle
    (
        @DateRage varchar(20),   --输入参数
        @startDate varchar(30) ,  --输出参数
        @endDate varchar(30)   -- 输出参数
    )
    as
     begin
           if(@DateRage = ‘上月’)
            begin
                --返回日期的算法
            end
          if(@DateRage = ‘上周’)
            begin
                --返回日期的算法
            end
           --继续判断---
           -----
    end
    go   

    3、实例如下

    /***********************************************
    根据日期周期类型返回查询周期
    输入参数:@DateRage:日期周期类型
    输出参数:@startDate:查询周期的开始日期
              @endDate:查询周期的结束日期
    ***********************************************/
    /***
    ** 获取查询的周期
    ***/
    create proc [dbo].[sp_GetDateCycle](
        @DateRage varchar(20),
        @startDate varchar(30) output,
        @endDate varchar(30) output
    )
    as 
    begin 
        --声明变量--
        declare @nowDate datetime
        declare @startstr varchar(20)
        declare @endstr varchar(20) 
        declare @datestr1 varchar(30)
        declare @datestr2 varchar(30)
        --初始化变量--
        set @startstr = ' 00:00:00'
        set @endstr = ' 23:59:59'
        
        --进行日期范围判断--
        if(@DateRage='上月')
        begin
            ----计算当前日期与sql的初始日期(1900-01-01 00:00:00)的差值,返回月份
            --select DATEDIFF(MM,0,GETDATE())
            ----返回月份减去1,计算出上个月第一天日期--
            --select DATEADD(MM,DATEDIFF(MM,0,GETDATE())-1,0)
            ----获取当前月第一天日期--
            --select DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0)
            ----减去3毫秒,计算出上个月的最后一天日期(sql精确到3毫秒)--
            --select DATEADD(MS,-3,DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0))            
            
            --返回上月查询日期(开始到结束) 日期类型转字符类型--
            set @startDate = CONVERT(varchar(19),DATEADD(MM,DATEDIFF(MM,0,GETDATE())-1,0),120)    
            set @endDate = CONVERT(varchar(19),DATEADD(MS,-3,DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0)),120)
        end
        if(@DateRage ='上周')
        begin
            -- --计算当前日期与sql的初始日期差值(返回周)--
            --select DATEDIFF(wk,0,GETDATE())
            ----返回的周期数减去1,,得到上周星期一的日期--
            --SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE())-1,0) 
            ----获取本周星期一的日期--
            --SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()),0) 
            ----减去3毫秒,计算上周星期天的日期--
            --select DATEADD(MS,-3, DATEADD(wk, DATEDIFF(wk,0,GETDATE()),0))
            
            --返回上周查询日期(开始到结束) 日期类型转字符类型 --
            set @startDate = CONVERT(varchar(19),DATEADD(wk, DATEDIFF(wk,0,GETDATE())-1,0),120)
            set @endDate = CONVERT(varchar(19),DATEADD(MS,-3, DATEADD(wk, DATEDIFF(wk,0,GETDATE()),0)),120)
        end
        if(@DateRage='昨天')
        begin
            /***
            思考步骤如下:
            1)获取昨天日期(日期类型 yyyy-MM-dd hh:mm:ss)        
            2)转化昨天日期(字符类型 yyyy-MM-dd)
            3)返回查询日期(开始日期到结束日期)
            ***/    
            
            ----获取昨天日期--
            -- select DATEADD(DAY,-1,GETDATE())
            --将日期类型转换为字符类型(yyyy-MM-dd)
            select @datestr1 = CONVERT(varchar(10),DATEADD(DAY,-1,GETDATE()),120)    
            select @datestr2 = CONVERT(varchar(10),DATEADD(DAY,-1,GETDATE()),120)
            --返回昨天查询日期(开始到结束)--
            set @startDate = @datestr1 + @startstr
            set @endDate = @datestr2 + @endstr
        end
        if(@DateRage='今天')
        begin
            /***
            思考步骤如下:
            1)获取当前日期(日期类型 yyyy-MM-dd hh:mm:ss)
            2)转化当前日期(字符类型 yyyy-MM-dd)
            3)返回查询日期(开始日期到结束日期)
            ***/
            ---- 获取当前日期--
            --select DATEADD(DAY,0,GETDATE())
            --将日期类型转换为字符类型(yyyy-MM-dd)
            select @datestr1 = CONVERT(varchar(10),DATEADD(DAY,0,GETDATE()),120)
            select @datestr2 = CONVERT(varchar(10),DATEADD(DAY,0,GETDATE()),120)
            --返回今天查询日期(开始到结束)--
            set @startDate = @datestr1 + @startstr
            set @endDate = @datestr2  + @endstr
        end
        if(@DateRage='本周')
        begin
         --   --计算当前日期与sql的初始日期差值(返回周)--
            --select DATEDIFF(wk,0,GETDATE())
            ----获取本周的星期一的日期--
            --SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()),0) 
            ----返回的周期数加上1,计算下周的星期一的日期--
            --SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE())+1,0) 
            ----减去3毫秒,计算本周星期天的日期--
            --select DATEADD(MS,-3,DATEADD(wk,DATEDIFF(wk,0,GETDATE())+1,0))
            
            --返回本周查询日期(开始到结束)--
            set @startDate = CONVERT(varchar(19), DATEADD(wk, DATEDIFF(wk,0,GETDATE()),0),120)
            set @endDate = CONVERT(varchar(19),DATEADD(MS,-3,DATEADD(wk,DATEDIFF(wk,0,GETDATE())+1,0)),120)
        end
        if(@DateRage='本月')
        begin
         --   --计算当前日期与sql的初始日期(1900-01-01 00:00:00)的差值,返回月份
            --select DATEDIFF(MM,0,GETDATE())
            ----得到当前月第一天日期--
            --select DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0)
            ----返回月份加上1,计算出下个月第一天日期--
            --select DATEADD(MM,DATEDIFF(MM,0,GETDATE())+1,0)
            ----减去3毫秒,计算出当前月的最后一天日期--
            --select DATEADD(MS,-3,DATEADD(MM,DATEDIFF(MM,0,GETDATE())+1,0))
                
            --返回本月的查询日期(开始到结束----        
            --将当前月第一天日期转化(日期类型转字符类型)
            set @startDate = CONVERT(varchar(19),DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0),120)
            --将当前月最后一天日期转化(日期类型转字符类型)
            set @endDate = CONVERT(varchar(19),DATEADD(MS,-3,DATEADD(MM,DATEDIFF(MM,0,GETDATE())+1,0)),120)
        end    
    end

    点击执行,生成存储过程: sp_GetDateCycle

    4、调用存储过程

    创建成功后,怎样调用辨析的存储过程呢?

    --声明输出参数--
    declare @startDate varchar(30)
    declare @endDate varchar(30)
    --获取上个月的查询日期--
    --exec sp_GetDateCycle '上月',@startDate output,@endDate output 
    --获取上周的查询日期--
    --exec sp_GetDateCycle '上周',@startDate output,@endDate output 
    --获取昨天的查询日期--
    --exec sp_GetDateCycle '昨天',@startDate output,@endDate output 
    --获取今天的查询日期--
    --exec sp_GetDateCycle '今天',@startDate output,@endDate output 
    --获取本周的查询日期--
    exec sp_GetDateCycle '本周',@startDate output,@endDate output 
    --获取本月的查询日期--
    --exec sp_GetDateCycle '本月',@startDate output,@endDate output 
    --输出查询周期---
    select @startDate
    select @endDate

    5、实际效果如下:

    1)当调用存储过程输入参数为今天,返回的日期范围

    2)当调用存储过程输入参数为上周,返回的日期范围

    3)当调用存储过程输入参数为上月,返回日期范围

    PS:

    参考网址: http://blog.csdn.net/zengcong2013/article/details/50134373

    展开全文
  • 我想要的是向yahoo网站发送参数,经过yahoo服务器处理返回的xml数据,但不知道本地怎样接收。在浏览器里输入http://xml.weather.yahoo.com/forecastrss?p=CHXX0008&u=c,会自动返回一个xml格式的数据给浏览器,现在...
  • CommonUtil.setResponseMsg("FFFFF", "查询人脸识别系统参数发生异常", moduleUtil); return "fail"; } String ip = sysParams.getString("ip"); String url =sysParams.getString("url"); //...
  • 在上一篇文章中,我们介绍了在Firefox,...如果你只是使用xpath在html文档中简单的查询,evaluate()中的命名空间解析器参数一般为null,如果你倾向于使用xpath在包含命名空间的xml文档中查询,那么你应该学会怎样创建
  • 创建一个request对象并填充那些有可能被所引用的servlet使用的信息,如参数、头部、cookies、查询字符串、URI等等。一个request对象是javax.servlet.ServletRequest或javax.servlet.http.ServletRequest接口的一个...
  • 怎么查询怎样写sql在sql 语句中判断不能用 == ,要用 = 就行了 ,赋值 用 := 函数 和 储存过程的相同点 和不同点:函数的创建:函数只能在指定数据库中用。 和存储方法一样delimiter $$create function 函数...
  • Numpy基础知识小记

    2021-01-28 20:03:06
    Numpy基础知识小记Numpy的array以及创建方法和操作函数array对象的背景array本身的属性创建array的方法创建array的便捷函数array本身支持大量操作和函数Numpy怎样对数组使用索引查询基础索引一维数组二维数组神奇...
  • 第一种是通过rawQuery()这个方法,接收一个sql语句,获取查询的结果内容,第二种方式是通过API中提供的Query()方法,根据指定参数来获取查询结果,下面分别来看一下这两种方式具体是怎样去实现的。 首先来看通过sql...
  • Dapper扩展IDbConnection,提供有用的扩展方法来查询数据库。 那么Dapper是怎样工作的呢? 总共三步: 创建一个IDbConnection对象 写一个语句来执行CRUD操作 传递语句作为Execute方法的一个参数 因为这篇...
  • 1.6.3 怎样建立自己的定制数据库创建 脚本 1.6.4 如何从已有数据库克隆数据库 1.6.5 怎样利用 Database Configuration Assistant 创建数据库 1.7 完成数据库配置 1.7.1 创建表空间 1.7.2 执行数据字典配置...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    怎样创建无名的中间的常量结构值? 2.12 怎样从/向数据文件读/写结构? 结构填充 2.13 为什么我的编译器在结构中留下了空洞?这导致空间浪费而且无法与外部数据文件进行“二进制”读写。能否关掉填充,或者控制...
  • XProf最初是为了帮助解决实时,高度并发和已利用的后端系统的性能问题而创建的。 高延迟或CPU使用率高通常是由触发低效率代码的非常特定的请求引起的。 查找此代码通常非常困难。 在这种原始用法中,首先要检查执行...
  • 用宏实现数据表,数据字段的动态查询的报表实例屡见不鲜,用宏也可以实现数据集的动态设定,我们经常做报表时,数据是直接写到报表单元格的,而动态设定数据集时,要怎样在设计报表的时候写数据呢? 具体实现方式...
  •  第2章对什么是数据库系统和怎样构造数据库系统等基础知识进行了介绍。对MySQL系统的剖析充分展示了现代关系数据库系统的关键组件。  第3章对MySQL软件的源代码以及如何获得和构建一个MySQL系统做了全面的介绍。...
  • MySQL中文参考手册

    2010-08-10 22:11:55
    2.3 怎样报告错误或问题 2.4 在邮件列表上回答问题的指南 3 MySQL的许可证和技术支持 3.1 MySQL的许可证政策 3.2 MySQL 使用的版权 3.2.1 可能的未来版权改变 3.3 MySQL商业性分发 3.4 许可证实例 3.4.1 销售...
  • o 7.17 我怎样在函数参数传递时混用静态和动态多维数组 ? o 7.18 当数组是函数的参数时, 为什么 sizeof 不能正确报告数组的大小 ? * 8. 内存分配 o 8.1 为什么这段代码不行?char *answer; printf("Type ...
  • 查询和设置系统参数 40 确定当前屏幕分辨率 40 使用预定义Windows光标 41 检索原先的Task Manager应用程序使用的任务列表 41 确定Windows和Windows系统目录 42 在哪儿创建临文件 42 我怎样才能建立一个等待光标 43 ...
  • MySQL网络数据库指南

    2009-03-20 16:03:32
    1.2.3 样例数据库怎样才能满足需求 6 1.3 基本数据库术语 7 1.3.1 基本术语 7 1.3.2 查询语言术语 9 1.3.3 MySQL的体系结构术语 9 1.4 MySQL教程 10 1.4.1 基本要求 10 1.4.2 取得样例数据库的分发包 11 1.4.3 建立...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 228
精华内容 91
关键字:

怎样创建参数查询