从存储过程的 sqldatasource 更新事件中的输出值中获取空值
Getting null from output value in sqldatasource updated event from storedprocedure
我不明白为什么我一直从存储过程中获取空值...我在不同的 sqldatasource 中对插入做完全相同的事情,我得到了 scope_identity 返回,但在更新时我无法获得返回值...
这是存储过程。我试过 remove set nocount on even 并且没有改变任何东西
ALTER PROCEDURE [dbo].[sp_UPDATE_ADefinicao_Extrusao]
@RegistoID int,
@Base_Cru varchar(50),
@Linha_Cru varchar(5),
@Diametro_Cru numeric(6,2),
@Espessura_Cru numeric(6,2),
@Comprimento_Cru numeric(6,2),
@Marcacao_Continua_Cru varchar(max),
@ID int = null OUTPUT
AS
BEGIN
SET NOCOUNT ON
UPDATE RVFC_Definicao
SET [Base_Cru] = @Base_Cru, [Linha_Cru] = @Linha_Cru, [Diametro_Cru] =
@Diametro_Cru, [Espessura_Cru] = @Espessura_Cru,
[Comprimento_Cru] = @Comprimento_Cru, [Marcacao_Continua_Cru] =
@Marcacao_Continua_Cru, [Data_Registo_Extrusao] =
CONVERT(VARCHAR,GETDATE(),105)
WHERE ID_Registo = @RegistoID
SET @ID = @RegistoID
SELECT @ID -- Update successful
END
和我的 sqldatasource,我尝试为 varchars 设置大小,但没有改变任何东西,因为我什至没有在插入一个上这样做。
<asp:SqlDataSource
ID="sdsADefinicao"
runat="server"
ConnectionString="<%$ ConnectionStrings:ValidacaoFormas_ConnectionString %>"
UpdateCommand="sp_UPDATE_ADefinicao_Extrusao"
UpdateCommandType="StoredProcedure"
OnUpdated="sdsADefinicao_Updated"
SelectCommandType="StoredProcedure"
SelectCommand="sp_SELECT_ADefinicao">
<SelectParameters>
<asp:ControlParameter ControlID="hdfRegistoID" Name="RegistoID" Type="Int32" />
</SelectParameters>
<UpdateParameters>
<asp:ControlParameter ControlID="fvADefinicao" Name="RegistoID" PropertyName="SelectedValue" Type="Int32" />
<asp:Parameter Name="Base_Cru" Type="String" Size="50" />
<asp:Parameter Name="Linha_Cru" Type="String" Size="5" />
<asp:Parameter Name="Diametro_Cru" Type="Decimal" />
<asp:Parameter Name="Espessura_Cru" Type="Decimal" />
<asp:Parameter Name="Comprimento_Cru" Type="Decimal" />
<asp:Parameter Name="Marcacao_Continua_Cru" Type="String"/>
<asp:Parameter Name="ID" Type="Int32" Direction="Output" />
</UpdateParameters>
</asp:SqlDataSource>
和代码隐藏以获得价值
protected void sdsADefinicao_Updated(object sender, SqlDataSourceStatusEventArgs e)
{
int registoID = Convert.ToInt32(e.Command.Parameters["@ID"].Value);
FileUpload fuAnexo = fvADefinicao.FindControl("fuAnexo") as FileUpload;
int numFiles = fuAnexo.PostedFiles.Count;
int index = 0;
Ficheiro[] files = new Ficheiro[numFiles];
foreach (HttpPostedFile file in fuAnexo.PostedFiles)
{
Ficheiro anexo = new Ficheiro("HUTMATER");
anexo.Nome = Path.GetFileName(file.FileName);
using (Stream fs = file.InputStream)
using (BinaryReader br = new BinaryReader(fs))
{
anexo.Dados = br.ReadBytes((Int32)fs.Length);
}
files[index] = anexo;
}
string piloto = SessionManager.Nome;
Ficheiro.Upload(Convert.ToInt32(registoID), piloto, files); // Guarda anexos do formulario na base de dados
}
好的,我终于找到了答案。这并不容易,除了真正的异常被空引用隐藏之外,一切都是正确的。似乎出于某种原因,我发送的参数出现了太多参数异常。
@RegistoID and @ID_Registo
但是我不知道为什么,因为我从来没有任何 @ID_Registo 参数,那只是数据库中的列名。将参数名称更改为 @ID_Registo 后,我能够 return 来自存储过程的值。
如果有人遇到这个问题,请尝试将参数名称更改为与数据库中的列名称相同
我不明白为什么我一直从存储过程中获取空值...我在不同的 sqldatasource 中对插入做完全相同的事情,我得到了 scope_identity 返回,但在更新时我无法获得返回值...
这是存储过程。我试过 remove set nocount on even 并且没有改变任何东西
ALTER PROCEDURE [dbo].[sp_UPDATE_ADefinicao_Extrusao]
@RegistoID int,
@Base_Cru varchar(50),
@Linha_Cru varchar(5),
@Diametro_Cru numeric(6,2),
@Espessura_Cru numeric(6,2),
@Comprimento_Cru numeric(6,2),
@Marcacao_Continua_Cru varchar(max),
@ID int = null OUTPUT
AS
BEGIN
SET NOCOUNT ON
UPDATE RVFC_Definicao
SET [Base_Cru] = @Base_Cru, [Linha_Cru] = @Linha_Cru, [Diametro_Cru] =
@Diametro_Cru, [Espessura_Cru] = @Espessura_Cru,
[Comprimento_Cru] = @Comprimento_Cru, [Marcacao_Continua_Cru] =
@Marcacao_Continua_Cru, [Data_Registo_Extrusao] =
CONVERT(VARCHAR,GETDATE(),105)
WHERE ID_Registo = @RegistoID
SET @ID = @RegistoID
SELECT @ID -- Update successful
END
和我的 sqldatasource,我尝试为 varchars 设置大小,但没有改变任何东西,因为我什至没有在插入一个上这样做。
<asp:SqlDataSource
ID="sdsADefinicao"
runat="server"
ConnectionString="<%$ ConnectionStrings:ValidacaoFormas_ConnectionString %>"
UpdateCommand="sp_UPDATE_ADefinicao_Extrusao"
UpdateCommandType="StoredProcedure"
OnUpdated="sdsADefinicao_Updated"
SelectCommandType="StoredProcedure"
SelectCommand="sp_SELECT_ADefinicao">
<SelectParameters>
<asp:ControlParameter ControlID="hdfRegistoID" Name="RegistoID" Type="Int32" />
</SelectParameters>
<UpdateParameters>
<asp:ControlParameter ControlID="fvADefinicao" Name="RegistoID" PropertyName="SelectedValue" Type="Int32" />
<asp:Parameter Name="Base_Cru" Type="String" Size="50" />
<asp:Parameter Name="Linha_Cru" Type="String" Size="5" />
<asp:Parameter Name="Diametro_Cru" Type="Decimal" />
<asp:Parameter Name="Espessura_Cru" Type="Decimal" />
<asp:Parameter Name="Comprimento_Cru" Type="Decimal" />
<asp:Parameter Name="Marcacao_Continua_Cru" Type="String"/>
<asp:Parameter Name="ID" Type="Int32" Direction="Output" />
</UpdateParameters>
</asp:SqlDataSource>
和代码隐藏以获得价值
protected void sdsADefinicao_Updated(object sender, SqlDataSourceStatusEventArgs e)
{
int registoID = Convert.ToInt32(e.Command.Parameters["@ID"].Value);
FileUpload fuAnexo = fvADefinicao.FindControl("fuAnexo") as FileUpload;
int numFiles = fuAnexo.PostedFiles.Count;
int index = 0;
Ficheiro[] files = new Ficheiro[numFiles];
foreach (HttpPostedFile file in fuAnexo.PostedFiles)
{
Ficheiro anexo = new Ficheiro("HUTMATER");
anexo.Nome = Path.GetFileName(file.FileName);
using (Stream fs = file.InputStream)
using (BinaryReader br = new BinaryReader(fs))
{
anexo.Dados = br.ReadBytes((Int32)fs.Length);
}
files[index] = anexo;
}
string piloto = SessionManager.Nome;
Ficheiro.Upload(Convert.ToInt32(registoID), piloto, files); // Guarda anexos do formulario na base de dados
}
好的,我终于找到了答案。这并不容易,除了真正的异常被空引用隐藏之外,一切都是正确的。似乎出于某种原因,我发送的参数出现了太多参数异常。
@RegistoID and @ID_Registo
但是我不知道为什么,因为我从来没有任何 @ID_Registo 参数,那只是数据库中的列名。将参数名称更改为 @ID_Registo 后,我能够 return 来自存储过程的值。
如果有人遇到这个问题,请尝试将参数名称更改为与数据库中的列名称相同