小编Dav*_*nov的帖子

如何禁止从SQL Server中的另一个存储过程调用的存储过程的SELECT输出?

我不是在谈论做"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).

sql t-sql sql-server

53
推荐指数
5
解决办法
8万
查看次数

数据访问层到业务对象的最佳"模式"

我正试图找出最干净的方法来做到这一点.

目前我有一个客户对象:

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)

c# asp.net design-patterns data-access-layer

16
推荐指数
2
解决办法
2万
查看次数

从GridView行获取对象

基本上,我想要我的对象回来......

我有一个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甚至可以这样做吗?我需要自己动手吗?如果能为我做这件事真的很酷.


详细说明. …

asp.net gridview

10
推荐指数
2
解决办法
2万
查看次数

DropDownList OnSelectedIndexChange到第0个索引w/out ViewState

我确实按照文章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

6
推荐指数
2
解决办法
2万
查看次数

压缩存档并保留相对路径

我在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

powershell zip

6
推荐指数
2
解决办法
3937
查看次数

ODP.net在连接关闭时是否关闭引用游标?

我还没有在任何地方找到明确说明的内容,但我在网上找到的一些例子都遵循我一直在做的事情.

我有一个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文档在描述此过程时更加明确.

c# oracle odp.net

5
推荐指数
1
解决办法
8864
查看次数