2

很具体的问题。我正在制作一个检测文件的程序。当有一个具有特定名称的新文件时,它会将其保存到服务器。这工作正常。问题是,它保存的变量之一是一个唯一的数字,它应该随着它上传的每个文件而增加。所以第一个文件的唯一编号为 400,下一个文件的唯一编号为 401,依此类推。

我上传了一个测试文件到服务器,所以已经有一个唯一编号为 400 的文件。我现在想要的是我的下一个文件应该有下一个编号。为此,它必须从第一列的最后一个单元格中获取数字。我发现 SQL 语句是 SELECT TOP 1 * FROM EKG_Temp ORDER BY ekgmaaleid DESC。我已经对包含 SQL 语句的命令 loadCMD 进行了评论。

表的名称是 EKG_Temp。列的名称是 ekgmaaleid,类型是 BigInt

我有兴趣将 ekgmaaleid 列中的最后一个单元格保存为我的程序中的变量,以供以后使用。

    public void SaveFile(string fileName, byte[] BlobValue)
    {
        string fullPath = (folder + "/" + fileName);
        fileExtension = fileName.Substring(fileName.Length - 3);
        if (saveBool == true)
        {
            SqlConnection con = new SqlConnection(@"Data Source=Irrelavant");
            SqlCommand SaveCmdTemporary = new SqlCommand("insert into EKG_Temp(ekgmaaleid,dato,borger_cprnr,raa_data,maaleformat_type) values(@ekgmaaleid,@dato,@borger_cprnr,@raa_data,@maaleformat_type)", con);
            //SqlCommand SaveCmdPermanent = new SqlCommand("insert into EKG_Temp(ekgmaaleid,dato,borger_cprnr,raa_data,maaleformat_type) values(@ekgmaaleid,@dato,@borger_cprnr,@raa_data,@maaleformat_type)", con);
            //SqlCommand LoadCmd = new SqlCommand("SELECT TOP 1 * FROM EKG_Temp ORDER BY ekgmaaleid DESC", con); //Husk at den faktisk skal vælge måleid ud fra EKG_Gemt i virkeligheden
            SqlParameter ekgmaaleidParam = new SqlParameter("@ekgmaaleid", SqlDbType.BigInt);
            SqlParameter datoParam = new SqlParameter("@dato", SqlDbType.DateTime);
            SqlParameter borger_cprnrParam = new SqlParameter("@borger_cprnr", SqlDbType.NVarChar, 50);
            SqlParameter raa_dataParam = new SqlParameter("@raa_data", SqlDbType.VarBinary, -1);
            SqlParameter maaleformat_typeParam = new SqlParameter("@maaleformat_type", SqlDbType.NVarChar, 10);
            SqlParameter loadMaaleIDParam = new SqlParameter("@ekgmaaleid", SqlDbType.BigInt);
            con.Open();
            SaveCmdTemporary.Parameters.Add(ekgmaaleidParam);
            SaveCmdTemporary.Parameters.Add(datoParam);
            SaveCmdTemporary.Parameters.Add(borger_cprnrParam);
            SaveCmdTemporary.Parameters.Add(raa_dataParam);
            SaveCmdTemporary.Parameters.Add(maaleformat_typeParam);
            //LoadCmd.Parameters.Add(loadMaaleIDParam);
            datoParam.Value = dato;
            borger_cprnrParam.Value = cpr;
            raa_dataParam.Value = BlobValue; //Kommer fra metoden FileCreated.
            maaleformat_typeParam.Value = fileExtension;
            try
            {
                SaveCmdTemporary.Connection.Open();
                SaveCmdTemporary.ExecuteNonQuery();
                MessageBox.Show("File saved to database.", "BLOB Saved", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Save Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                SaveCmdTemporary.Connection.Close();
                saveBool = false;
            }

        }
    }

这是数据库的图片以及我希望它执行的操作。

数据库

提前致谢。

4

1 回答 1

3

正确的做法是创建带有identity列的表;然后数据库将为您生成此值。之前插入的标识值的值可通过SCOPE_IDENTITY()or获得@@IDENTITY(前者是首选 - 特别是如果有触发器;后者适用于更多数据库版本,但有边缘情况)。

在多用户数据库上,这也避免了竞争条件问题(显然只有一个连接知道最近的插入)。您只需将insert命令更改为不指定identity(数据库将提供此值;您不必这样做)。

于 2013-11-14T09:38:51.803 回答