【问题标题】:Store ID value in SQL connection and return if it exists在 SQL 连接中存储 ID 值,如果存在则返回
【发布时间】:2019-09-25 01:01:38
【问题描述】:

我是编程新手,我正在尝试上传图像并将其保存在具有当前产品 ID 的文件夹中。但是,当我更新图像时,会创建一个新文件夹。 除了返回 maxId++,我如何将 ID 存储在 DataContext 中并在存在时返回它?代码如下。

    private void upload_Click_1(object sender, EventArgs e)
    {
        OpenFileDialog opFile = new OpenFileDialog();
        opFile.Title = "Select image for this product";
        opFile.Filter = "jpg files (*.jpg)|*.jpg|All files (*.*)|*.*";
        if (opFile.ShowDialog() == DialogResult.OK)
        {
        try
        {
            string iName = opFile.FileName;
            var dir = @"images/" + GetCurrentId();
            var path = Path.Combine(dir, Path.GetFileName(iName));

            if (!Directory.Exists(dir) &&(produto)this.tbprodutoBindingSource.Current == null))
            {
                Directory.CreateDirectory(dir);
            }

            File.Copy(iName, path);
        }
           catch (Exception ex)
        {
            MessageBox.Show("Unable to open file " + ex.Message);
        }
    }
    else
    {
        opFile.Dispose();
    }
        }

    private int GetCurrentId()
    {
        var result = dataContextFactory.DataContext.produtos.Max(x => x.id_produto);
        int maxId = Convert.ToInt32(result);
        if (maxId == 0) maxId = 1;
        else
            maxId++;

        return maxId;

    }

【问题讨论】:

  • 这里有一个职业提示:使用 MAX 获取下一个 id 是总是错误的,原因有几个。 ID 应该是自动递增的。插入您的记录,然后获取数据库生成的 id。

标签: c# windows


【解决方案1】:

我并没有真正得到你想要的,但我会尝试解决我遇到的问题。

  1. 您想在每次上传新照片时创建一个新文件夹,还是要将照片重命名为[Id][FileName].jpg?如果你想要后者,你可以改变这个
var dir = @"images/" + GetCurrentId();
var path = Path.Combine(dir, Path.GetFileName(iName));

进入这个

var dir = @"images";
var fileName = GetCurrentId() + Path.GetFileName(iName);
var path = Path.Combine(dir, fileName);
  1. 如果您想要一个自动增量 id,您应该将自动增量放在数据库中,而不是通过获取最后一个 id 并对其进行增量。但是,如果您的 id 不是很重要(您只需要它作为唯一标识符),您可以考虑使用 uuid 而不是自动递增。举个例子,你可以参考here
string id = Guid.NewGuid().ToString();
  1. File.Copy(iName, path) 不需要相同的文件名 iName 和路径,您可以更改名称,不会产生任何问题。

  2. 如果产品是新记录,可以生成uuid,用于图片,再用于产品id。

string id = Guid.NewGuid().ToString();
Product newProduct = new Product();
newProduct.ProductID = id;
var dir = "@images";
var path = Path.Combine(dir, id);
File.Copy(iName, path);

如果产品是旧记录,您可以从产品中获取 id,并将该 id 用作图像名称。

Product existingProduct = getProduct();
string id = existingProduct.GetID();
var dir = "@images";
var path = Path.Combine(dir, id);
File.Copy(iName, path);

【讨论】:

  • 您的建议行不通,我正在尝试将产品详细信息添加到数据库中的图像中,但我想将图像存储在自动编号的产品 ID 中,但由于它尚未创建,我无法从中获取 id。这就是我做 max+1 的原因,但是当我更新它时,它会创建一个新文件夹。我想从尚未创建的产品中获取 id
  • 如何获取 productBindingSource.Current ID?
  • 有人能帮帮我吗?
  • 可以在插入前生成uuid using C# library获取uuid。
  • 在哪里可以找到任何示例?
【解决方案2】:

File.Copy(iName, path) 不需要相同的文件名 iName 和路径,您可以更改名称,不会产生任何问题。 实际上它会导致错误,因为我正在处理文件,当我更改图像名称时会导致错误并且图像无法上传。

我不想每次上传图片时都创建文件夹,我想将尚未创建的产品 ID 调整到图片文件夹。如果当前产品 ID 为 22,我需要一个名称为 22 的文件夹及其上的图像。 什么目的也允许我更新?

【讨论】:

    【解决方案3】:

    File.Copy(iName, path) 不需要相同的文件名 iName 和 路径,您可以更改名称,这不会产生任何问题。 实际上它会导致错误,因为我正在处理文件,当我 更改图像的名称会导致错误并且图像不能 上传。

    我尝试将图像复制到另一个路径,它不会导致任何问题。但是如果图片的名字是由你上传的,那就没办法了。

    我不想每次上传图片时都创建一个文件夹,我想要 将尚未创建的产品 ID 调整到图像文件夹。 如果当前产品 ID 是 22,我需要一个名称为 22 的文件夹和 它的图像就可以了。

    您可以使用以下方法实现此目的:

    var dir = @"images/" + imageID;
    var path = Path.Combine(dir, Path.GetFileName(iName));
    File.Copy(iName, path);
    

    还有什么目的允许我更新?

    是的。您可能希望在上传新图像之前删除旧图像。

    // Delete the old image in the folder
    var dir = @"images/" + imageID;
    string oldImageName = Directory.GetFiles(dir).FirstOrDefault();
    File.Delete(oldImageName);
    
    // Copy the new image to the folder
    var path = Path.Combine(dir, Path.GetFileName(iName));
    File.Copy(iName, path);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多