我不是在谈论做"SET NOCOUNT OFF".但我有一个存储过程,我用它来将一些数据插入到某些表中.这个过程创建一个xml响应字符串,让我举个例子:
CREATE PROCEDURE [dbo].[insertSomeData] (@myParam int) AS
DECLARE @reply varchar(2048)
... Do a bunch of inserts/updates...
SET @reply = '<xml><big /><outputs /></xml>'
SELECT @reply
GO
Run Code Online (Sandbox Code Playgroud)
所以我把一个使用这个SP的脚本放在一起,并且xml"输出"变得太多了(它已经崩溃了我的盒子).
有没有办法抑制或重定向从此存储过程生成的输出?我不认为修改此存储过程是一种选择.
谢谢.
我想我应该澄清一下.上面的SP由我编写的T-SQL Update脚本调用,通过企业工作室管理器等运行.
它也不是我写过的最优雅的SQL(一些psuedo-sql):
WHILE unprocessedRecordsLeft
BEGIN
SELECT top 1 record from updateTable where Processed = 0
EXEC insertSomeData @param = record_From_UpdateTable
END
Run Code Online (Sandbox Code Playgroud)
所以我们假设UpdateTable中有大约50k的记录.该SP被称为50k次,将50k xml字符串写入输出窗口.它没有让sql服务器停止,只是我的客户端应用程序(sql server management studio).
我正试图找出最干净的方法来做到这一点.
目前我有一个客户对象:
public class Customer
{
public int Id {get;set;}
public string name {get;set;}
public List<Email> emailCollection {get;set}
public Customer(int id)
{
this.emailCollection = getEmails(id);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我的Email对象也很基本.
public class Email
{
private int index;
public string emailAddress{get;set;}
public int emailType{get;set;}
public Email(...){...}
public static List<Email> getEmails(int id)
{
return DataAccessLayer.getCustomerEmailsByID(id);
}
}
Run Code Online (Sandbox Code Playgroud)
DataAccessLayer当前连接到数据库,并使用SqlDataReader迭代结果集并创建新的Email对象,并将它们添加到完成时返回的List.
那么我在哪里以及如何改进呢?
我是否应该让我的DataAccessLayer返回一个DataTable并将其留给Email对象进行解析并将List返回给Customer?
我猜"工厂"可能是错误的单词,但是我应该有另一种类型的EmailFactory从DataAccessLayer获取DataTable并将List返回给Email对象吗?我想这种声音多余......
将我的Email.getEmails(id)作为静态方法,这是否是正确的做法?
我可能只是试图找到并应用最好的"模式"来完成一项简单的任务.
谢谢.
跟进
我创建了一个工作示例,其中我的域/业务对象通过现有数据库中的id提取客户记录.nhibernate中的xml映射文件非常简洁.在我按照教程设置会话和存储库工厂之后,拉动数据库记录非常简单.
但是,我注意到了巨大的性能损失.
我的原始方法由DB上的存储过程组成,该过程由DAL对象调用,该对象将结果集解析为我的域/业务对象.
我用30分钟的原始方法来获取单个客户记录.然后我用nhibernate方法计时3000ms来获取相同的记录.
我错过了什么吗?或者使用这种nhibernate路由会有很多开销吗?
否则我喜欢代码的清洁度:
protected void Page_Load(object sender, EventArgs e)
{
ICustomerRepository repository = new CustomerRepository();
Customer …Run Code Online (Sandbox Code Playgroud) 基本上,我想要我的对象回来......
我有一个Email对象.
public class Email{
public string emailAddress;
public bool primary;
public int contactPoint;
public int databasePrimaryKey;
public Email(){}
}
Run Code Online (Sandbox Code Playgroud)
在我的usercontrol中,我是一个Email对象列表.
public List<Email> EmailCollection;
Run Code Online (Sandbox Code Playgroud)
我将它绑定到我的usercontrol中的GridView.
if(this.EmailCollection.Count > 0){
this.GridView1.DataSource = EmailCollection;
this.GridView1.DataBind();
}
Run Code Online (Sandbox Code Playgroud)
如果我可以稍后从GridView中取出一个Email对象,那真的很棒.
我该怎么做呢?
我也只将一些Email对象的属性绑定到GridView,并将它们放入项目模板中.
<Columns>
<asp:TemplateField HeaderText="Email Address">
<ItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text=<%# Eval("EmailAddress") %> Width=250px />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Primary">
<ItemTemplate>
<asp:CheckBox runat="server" Checked=<%# Eval("PrimaryEmail") %> />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Contact Point">
<ItemTemplate>
<CRM:QualDropDown runat="server" Type=ContactPoint InitialValue=<%# Eval("ContactPoint") %> />
</ItemTemplate>
</asp:TemplateField>
</Columns>
Run Code Online (Sandbox Code Playgroud)
GridView甚至可以这样做吗?我需要自己动手吗?如果能为我做这件事真的很酷.
详细说明. …
我确实按照文章TRULLY了解ViewState(很棒的文章btw)并填充我的下拉列表工作得很好.我甚至设置了一个OnSelectedIndexChange事件,它几乎同样激发.
我发现的问题是在选择第0个索引时不会触发SelectedIndexChanged事件.然而,它会做所有其他时间.
这是一些代码:
<asp:DropDownList runat="server" ID="DropDownList1" EnableViewState="false"
AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" />
Run Code Online (Sandbox Code Playgroud)
protected override void OnInit(EventArgs e)
{
this.DropDownList1.DataTextField = "Text";
this.DropDownList1.DataValueField = "Value";
this.DropDownList1.DataSource = fillQueueDropDown();
this.DropDownList1.DataBind();
base.OnInit(e);
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
OnSelectedQueueChanged(e);
}
public void OnSelectedQueueChanged(EventArgs e)
{
// Do stuff.
}
public event EventHandler queueNamesChangedEvent;
public void OnSelectedQueueChanged(EventArgs e)
{
if (queueNamesChangedEvent != null)
queueNamesChangedEvent(this, e);
}
Run Code Online (Sandbox Code Playgroud)
我想我可以在Page_Load方法中进行某种类型的检查:
if(ViewState["selectedIndexChangedFlag"] != 1)
// raise OnSelectedChange event
Run Code Online (Sandbox Code Playgroud)
或者我可以在OnInit()方法中设置一些东西,我每次都可以重新绑定这些数据吗?
请参阅,我的自定义EventHander引发一个事件,该事件由此控件所在的父页面捕获,以便父级可以使用新选择的值执行某些操作.这目前适用于所选索引> 0的所有情况.
我在此控件中创建了一个属性,其中包含最近选择的索引,在这种情况下,我的父页面可以对每个Page_Load ... dunno上的此属性值执行操作.
接受建议.或者如何强制此SelectedIndexChanged事件触发第0个索引选择.
asp.net viewstate user-controls selectedindexchanged drop-down-menu
我在compress-archive做自己想做的事情时充满挑战...
我有一个根项目文件夹,我想将子目录中的某些文件压缩并保留相对路径。例如:
/
??? _scripts
??? ??_module1
| | ??? filex.js
| ??_module2
| ??? file1.js
| ??? file2.txt
因此,我想从根目录创建一个包含的zip文件module2/*,并且我希望保留文件夹结构。我希望我的拉链包含:
scripts/module2/file1.js
scripts/module2/file2.txt
但是,当我从根文件夹运行此命令时:
Compress-Archive -Path "scripts\module2\*" -DestinationPath tmp.zip
压缩文件的内容仅包含:
/file1.js
/file2.txt
我还没有在任何地方找到明确说明的内容,但我在网上找到的一些例子都遵循我一直在做的事情.
我有一个C#类,它使用ODP.net连接到Oracle DB并运行一个包中的过程.
我的包有存储过程,它接受ref游标输出参数.所有过程都打开了特定select语句的游标.
如果我直接在oracle db上执行此过程,那么最终我将达到最大数量的打开游标错误.
所以我想知道ODP.net是否确实关闭了我在我的程序中打开的光标?
我正在使用OracleDataApaper.Fill(DataSet)方法.
例如.
DataSet ds = new DataSet();
OracleConnection conn = new OracleConnection(this.connStr);
OracleCommand com = new OracleCommand("MYPKG.MYQUERY", conn);
OracleDataAdapter adapter = new OracleDataAdapter(com);
conn.Open();
com.Parameters.Add("searchParam", OracleDbType.Varchar2).Value = "myName";
com.Parameters.Add("outCursor", OracleDbType.RefCursor, ParameterDirection.Output);
com.CommandType = CommandType.StoredProcedure;
adapter.Fill(ds);
conn.Close();
PROCEDURE GETALLEMAILS(searchParamIN VARCHAR2, outCursor OUT sys_refcursor) AS
BEGIN
open outCursor
select
EAEMAL as Email
from
EmailTable
where
EmailName = searchParam;
END GETALLEMAILS;
Run Code Online (Sandbox Code Playgroud)
我只是害怕在数据库上留下开放的游标.如果有人可以提供官方文档的链接,那就太好了!
更新:
感谢您的投入.我在打电话
com.Dispose();
conn.Close();
conn.Dispose();
Run Code Online (Sandbox Code Playgroud)
但他们离开了我的榜样.
我找到了这篇论坛帖子,其中说明OracleDataAdapter.Fill(Dataset)方法在执行Fill()方法后释放了引用游标.
http://www.frontoracle.com/oracle-archive/140/386140-close-ref-cursor.html
我希望Oracle文档在描述此过程时更加明确.