C# VS2022+WinForm+Oracle19.3+Excel,根据数据库表定义书生成SQL

news2024/11/27 1:40:11

目标:

用Excel写数据库的表的定义书,用该工具生成SQL,在客户端执行,把表结构导入数据库,生成真正的表

Github代码下载

目录

    • 0.完成下面开发环境的准备
      • 1 操作系统Win11 专业版 21H2
      • 2 oracle 19.3
      • 3 Visual Studio Community 2022
      • 4 数据库表定义书参照样式
    • 1 C#工程准备
      • 1.1 新建工程
      • 1.2 Form1添加控件
    • 2 添加代码
      • 2.1 button1_Click事件
      • 2.2 button2_Click事件
      • 2.3 button3_Click事件
      • 2.4 添加ColumnObject类
      • 2.5 添加共通方法,目的是实现“读入Excel到DataSet中”
    • 3 画面启动,测试结果
      • 3.1 生成如下的SQL文件
      • 3.2 SQL文件(T_PLAYER_PICTURES.SQL)内容如下
      • 3.3 最终生成的表结构

0.完成下面开发环境的准备

1 操作系统Win11 专业版 21H2

2 oracle 19.3

下载和安装手顺:https://blog.csdn.net/u011159350/article/details/125432921

3 Visual Studio Community 2022

下载地址:https://visualstudio.microsoft.com/zh-hans/vs/community/
下载后双击,选择下面两项,并安装

4 数据库表定义书参照样式

在这里插入图片描述

1 C#工程准备

1.1 新建工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建完工程后,如果显示0项目(Form1.cs的设计窗口不能显示,只显示代码),可能是Donet的环境变量出问题了,可以尝试下面的方案解决
VS2022中解决方案显示0项目 | 找不到指定的SDK“Microsoft.NET.Sdk”
在这里插入图片描述

1.2 Form1添加控件

添加Label控件:
label1.Text = Oracle数据库定义书文件路径:
label2.Text = SQL文件生成的文件夹路径:
追加textBox1
追加textBox2
button1.Text = 选择
button2.Text = 选择
button3.Text = 运行(生成SQL)
调整一下Form1窗口大小
Form1的FormBorderStyle = FormBorderStyle.FixedToolWindow
Form1的StartPosition = FormStartPosition.CenterScreen;
在这里插入图片描述

2 添加代码

2.1 button1_Click事件

双击button1,添加Click事件的内容

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Title = "请选择文件";
            openFileDialog.Filter = "Excel文件(*.xlsx)|*.xlsx|所有文件(*.*)|*.*";
            openFileDialog.FilterIndex = 1;
            openFileDialog.Multiselect = false;
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = openFileDialog.FileName;
                // 假设你的TextBox控件名为textBox1
                textBox1.SelectionStart = textBox1.Text.Length;
                textBox1.SelectionLength = 0; // 设置选择长度为0,表示没有文字被选中
                textBox1.Focus(); // 设置焦点到textBox1
            }
        }

2.2 button2_Click事件

双击button2,添加Click事件的内容

        private void button2_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
            folderBrowserDialog.Description = "请选择文件夹";
            if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
            {
                textBox2.Text = folderBrowserDialog.SelectedPath;
                // 假设你的TextBox控件名为textBox1
                textBox2.SelectionStart = textBox2.Text.Length;
                textBox2.SelectionLength = 0; // 设置选择长度为0,表示没有文字被选中
                textBox2.Focus(); // 设置焦点到textBox1
            }
        }

2.3 button3_Click事件

双击button3,添加Click事件的内容

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                string talbedesignbookpath = textBox1.Text;
                string sqlpath = textBox2.Text;
                DirectoryInfo directoryInfo = new DirectoryInfo(sqlpath);
                if (!directoryInfo.Exists)
                {
                    directoryInfo.Create();
                }
                DataSet ds = this.ReadExcelToDataSet(talbedesignbookpath);
                foreach (DataTable dt in ds.Tables)
                {
                    if (dt.TableName.Contains("$_xlnm#Print_Area"))
                    {
                        string tableid = dt.Rows[1][2].ToString();
                        string tablename = dt.Rows[2][2].ToString();

                        FileInfo file = new FileInfo(sqlpath + "\\" + tableid + ".SQL");
                        using (StreamWriter sw = file.CreateText())
                        {
                            sw.WriteLine("/*");
                            sw.WriteLine("-- 作成表的中文名:" + tablename);
                            sw.WriteLine("-- 作成表的英文名:" + tableid);
                            sw.WriteLine("-- 作成组织:无");
                            sw.WriteLine("-- 作成日期:" + DateTime.Now.ToString("yyyy/MM/dd"));
                            sw.WriteLine("-- 作成者:烟图黛螺");
                            sw.WriteLine("-- 修改历史:" + DateTime.Now.ToString("yyyy/MM/dd") + " 烟图黛螺 新建文件");
                            sw.WriteLine("*/");
                            sw.WriteLine("");
                            sw.WriteLine("------- 永久删除表,不进入回收站 ----------");
                            sw.WriteLine("DROP TABLE " + tableid + " PURGE;");
                            sw.WriteLine("/");
                            sw.WriteLine("");
                            sw.WriteLine("------- 创建表 ----------");
                            sw.WriteLine("CREATE TABLE " + tableid + " (");

                            int maxcolumnidlen = 0;
                            List<ColumnObject> ColumnObjectList = new List<ColumnObject>();
                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                if (dt.Rows[i][3] == null || dt.Rows[i][3].ToString().Trim().Length == 0)
                                {
                                    continue;
                                }

                                if (i >= 4)
                                {
                                    ColumnObject columnObject = new ColumnObject();
                                    // 列汉字名
                                    if (dt.Rows[i][2] != null && dt.Rows[i][2].ToString().Trim().Length > 0)
                                    {
                                        string columnname = dt.Rows[i][2].ToString();
                                        columnObject.Columnname = columnname;
                                    }
                                    // 列英文名
                                    if (dt.Rows[i][3] != null && dt.Rows[i][3].ToString().Trim().Length > 0)
                                    {
                                        string columnid = dt.Rows[i][3].ToString();
                                        columnObject.Columnid = columnid;
                                        if (columnid.Length > maxcolumnidlen)
                                        {
                                            maxcolumnidlen = columnid.Length;
                                        }
                                    }
                                    // 主键
                                    if (dt.Rows[i][4] != null && dt.Rows[i][4].ToString().Trim().Length > 0)
                                    {
                                        string columnkey = dt.Rows[i][4].ToString();
                                        columnObject.Columnkey = columnkey;
                                    }
                                    // 是否非空
                                    if (dt.Rows[i][5] != null && dt.Rows[i][5].ToString().Trim().Length > 0)
                                    {
                                        string columnnullable = dt.Rows[i][5].ToString();
                                        columnObject.Columnnullable = columnnullable;
                                    }
                                    // 类型
                                    if (dt.Rows[i][6] != null && dt.Rows[i][6].ToString().Trim().Length > 0)
                                    {
                                        string columntype = dt.Rows[i][6].ToString();
                                        columnObject.Columntype = columntype;
                                    }
                                    // 整数位
                                    if (dt.Rows[i][7] != null && dt.Rows[i][7].ToString().Trim().Length > 0)
                                    {
                                        string columninteger = dt.Rows[i][7].ToString();
                                        columnObject.Columninteger = columninteger;
                                    }
                                    // 小数位
                                    if (dt.Rows[i][8] != null && dt.Rows[i][8].ToString().Trim().Length > 0)
                                    {
                                        string columnxiaoshu = dt.Rows[i][8].ToString();
                                        columnObject.Columnxiaoshu = columnxiaoshu;
                                    }
                                    // 默认值
                                    if (dt.Rows[i][9] != null && dt.Rows[i][9].ToString().Trim().Length > 0)
                                    {
                                        string columndefault = dt.Rows[i][9].ToString();
                                        columnObject.Columndefault = columndefault;
                                    }
                                    // 约束条件
                                    if (dt.Rows[i][10] != null && dt.Rows[i][10].ToString().Trim().Length > 0)
                                    {
                                        string columncheck = dt.Rows[i][10].ToString();
                                        columnObject.Columncheck = columncheck;
                                    }
                                    ColumnObjectList.Add(columnObject);
                                }
                            }

                            // 创建表
                            int index = 0;
                            string line = string.Empty;
                            foreach (ColumnObject co in ColumnObjectList)
                            {
                                line = string.Empty;

                                if (co.Columnid == null || co.Columnid.Length == 0)
                                {
                                    continue;
                                }

                                if (index == 0)
                                {
                                    line = line + "     " + co.Columnid.PadRight(maxcolumnidlen + 5);
                                }
                                else
                                {
                                    line = line + "    ," + co.Columnid.PadRight(maxcolumnidlen + 5);
                                }

                                if (co.Columntype == "VARCHAR2")
                                {
                                    line = line + " VARCHAR2(" + co.Columninteger + " CHAR)";
                                }
                                else if (co.Columntype == "NUMBER")
                                {
                                    if (co.Columnxiaoshu == null || co.Columnxiaoshu.Length == 0)
                                    {
                                        line = line + " NUMBER(" + co.Columninteger + ",0)";
                                    }
                                    else
                                    {
                                        line = line + " NUMBER(" + co.Columninteger + "," + co.Columnxiaoshu + ")";
                                    }
                                }
                                else if (co.Columntype == "DATE")
                                {
                                    line = line + " DATE";
                                }

                                if (co.Columndefault != null && co.Columndefault.Length > 0)
                                {
                                    line = line + " DEFAULT " + co.Columndefault;
                                }

                                if (co.Columnnullable != null && co.Columnnullable.Length > 0)
                                {
                                    line = line + " NOT NULL";
                                }

                                sw.WriteLine(line);

                                index = index + 1;
                            }
                            if (index >= 1)
                            {
                                sw.WriteLine(");");
                                sw.WriteLine("/");
                                sw.WriteLine("");
                            }

                            // 添加触发器
                            sw.WriteLine("------- 添加触发器 ----------");
                            sw.WriteLine("CREATE OR REPLACE TRIGGER TRG_" + tableid + " BEFORE INSERT OR UPDATE ON " + tableid + " FOR EACH ROW");
                            sw.WriteLine("DECLARE");
                            sw.WriteLine("    LV_USER VARCHAR2(64 CHAR);");
                            sw.WriteLine("    LV_CLIENTID VARCHAR2(64 CHAR);");
                            sw.WriteLine("    LV_PROGRAMNAME VARCHAR2(50 CHAR);");
                            sw.WriteLine("    LV_TERMINALINAL VARCHAR2(50 CHAR);");
                            sw.WriteLine("BEGIN");
                            sw.WriteLine("    LV_USER := SYS_CONTEXT('USERENV', 'SESSION_USER');");
                            sw.WriteLine("    LV_CLIENTID:= SYS_CONTEXT('USERENV', 'CLIENT_INFO');");
                            sw.WriteLine("    LV_PROGRAMNAME:= SYS_CONTEXT('USERENV', 'CLIENT_PROGRAM_NAME');");
                            sw.WriteLine("    LV_TERMINALINAL:= SYS_CONTEXT('USERENV', 'TERMINAL');");
                            sw.WriteLine("");
                            sw.WriteLine("    IF NOT LV_CLIENTID IS NULL");
                            sw.WriteLine("        AND LENGTH(LV_CLIENTID) > 0");
                            sw.WriteLine("    THEN");
                            sw.WriteLine("        IF INSTR(LV_CLIENTID, ',') > 0");
                            sw.WriteLine("        THEN");
                            sw.WriteLine("            LV_USER := SUBSTR(LV_CLIENTID, 1, INSTR(LV_CLIENTID, ',') - 1);");
                            sw.WriteLine("            LV_PROGRAMNAME:= SUBSTR(LV_CLIENTID, INSTR(LV_CLIENTID, ',') + 1);");
                            sw.WriteLine("");
                            sw.WriteLine("            IF INSTR(LV_PROGRAMNAME, ',') > 0");
                            sw.WriteLine("            THEN");
                            sw.WriteLine("                LV_TERMINALINAL := SUBSTR(LV_PROGRAMNAME, INSTR(LV_PROGRAMNAME, ',') + 1);");
                            sw.WriteLine("                LV_PROGRAMNAME:= SUBSTR(LV_PROGRAMNAME, 1, INSTR(LV_PROGRAMNAME, ',') - 1);");
                            sw.WriteLine("            END IF;");
                            sw.WriteLine("        ELSE");
                            sw.WriteLine("            LV_USER := LV_CLIENTID;");
                            sw.WriteLine("        END IF;");
                            sw.WriteLine("    ELSE");
                            sw.WriteLine("        LV_USER := LV_USER || ',' || LV_PROGRAMNAME;");
                            sw.WriteLine("    END IF;");
                            sw.WriteLine("");
                            sw.WriteLine("    IF INSERTING");
                            sw.WriteLine("    THEN");
                            sw.WriteLine("        : new.INSTID := LV_USER;");
                            sw.WriteLine("        :new.INSTDT := sysdate;");
                            sw.WriteLine("        :new.INSTTERM := LV_TERMINALINAL;");
                            sw.WriteLine("        :new.INSTPRGNM := LV_PROGRAMNAME;");
                            sw.WriteLine("    END IF;");
                            sw.WriteLine("");
                            sw.WriteLine("    IF INSERTING OR UPDATING");
                            sw.WriteLine("    THEN");
                            sw.WriteLine("        : new.UPDTID := LV_USER;");
                            sw.WriteLine("        :new.UPDTDT := sysdate;");
                            sw.WriteLine("        :new.UPDTTERM := LV_TERMINALINAL;");
                            sw.WriteLine("        :new.UPDTPRGNM := LV_PROGRAMNAME;");
                            sw.WriteLine("    END IF;");
                            sw.WriteLine("END;");
                            sw.WriteLine("/");
                            sw.WriteLine("");

                            // 添加主键索引
                            sw.WriteLine("-------添加主键索引----------");
                            index = 0;
                            line = "ALTER TABLE " + tableid + " ADD CONSTRAINT PK_" + tableid + " PRIMARY KEY (";
                            foreach (ColumnObject co in ColumnObjectList)
                            {
                                if (co.Columnkey != null && co.Columnkey.Length > 0)
                                {
                                    if (index == 0)
                                    {
                                        line = line + co.Columnid;
                                    }
                                    else
                                    {
                                        line = line + "," + co.Columnid;
                                    }
                                    index = index + 1;
                                }
                            }
                            line = line + ");";
                            if (index >= 1)
                            {
                                sw.WriteLine(line);
                                sw.WriteLine("/");
                                sw.WriteLine("");
                            }

                            // 添加约束条件
                            sw.WriteLine("------- 添加约束条件 ----------");
                            foreach (ColumnObject co in ColumnObjectList)
                            {
                                if (co.Columncheck != null && co.Columncheck.Length > 0)
                                {
                                    line = "ALTER TABLE " + tableid + " ADD CONSTRAINT CHECK_" + tableid + "_" + co.Columnid + "_1 CHECK(" + co.Columncheck + ");";
                                    sw.WriteLine(line);
                                    sw.WriteLine("/");
                                }
                            }
                            sw.WriteLine("");

                            // 添加表和列名的注释
                            sw.WriteLine("------- 添加表和列名的注释 ----------");
                            line = "COMMENT ON TABLE " + tableid + " IS '" + tablename + "';";
                            sw.WriteLine(line);
                            sw.WriteLine("/");
                            foreach (ColumnObject co in ColumnObjectList)
                            {
                                line = "COMMENT ON COLUMN " + tableid + "." + co.Columnid + " IS '" + co.Columnname + "';";
                                sw.WriteLine(line);
                                sw.WriteLine("/");
                            }
                        }
                    }
                }

                MessageBox.Show(sqlpath + Environment.NewLine + "SQL文件生成完了");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

2.4 添加ColumnObject类

在namespace WindowsFormsApp2下添加如下的代码

    public class ColumnObject
    {
        // 列汉字名
        private string columnname;
        // 列英文名
        private string columnid;
        // 主键
        private string columnkey;
        // 是否非空
        private string columnnullable;
        // 类型
        private string columntype;
        // 整数位
        private string columninteger;
        // 小数位
        private string columnxiaoshu;
        // 默认值
        private string columndefault;
        // 约束条件
        private string columncheck;

        public string Columnname { get => columnname; set => columnname = value; }
        public string Columnid { get => columnid; set => columnid = value; }
        public string Columnkey { get => columnkey; set => columnkey = value; }
        public string Columnnullable { get => columnnullable; set => columnnullable = value; }
        public string Columntype { get => columntype; set => columntype = value; }
        public string Columninteger { get => columninteger; set => columninteger = value; }
        public string Columnxiaoshu { get => columnxiaoshu; set => columnxiaoshu = value; }
        public string Columndefault { get => columndefault; set => columndefault = value; }
        public string Columncheck { get => columncheck; set => columncheck = value; }
    }

2.5 添加共通方法,目的是实现“读入Excel到DataSet中”

在Form1下边添加下面的方法和button1_Click同一层

        private DataSet ReadExcelToDataSet(string path)
        {
            //连接字符串
            /* 备注:
            	添加 IMEX=1 表示将所有列当做字符串读取,实际应该不是这样,
            	系统默认会查看前8行如果有字符串,则该列会识别为字符串列。
            	如果前8行都是数字,则还是会识别为数字列,日期也一样;
            	如果你觉得8行不够或者太多了,则只能修改注册表HKEY_LOCAL_MACHINE/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRows,
            	如果此值为0,则会根据所有行来判断使用什么类型,通常不建议这麽做,除非你的数据量确实比较少
            */
            string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;IMEX=1';";

            using (OleDbConnection conn = new OleDbConnection(connstring))
            {
                conn.Open();
                DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });//存放所有的sheet
                DataSet set = new DataSet();
                for (int i = 0; i < sheetsName.Rows.Count; i++)
                {
                    string sheetName = sheetsName.Rows[i][2].ToString();
                    string sql = string.Format("SELECT * FROM [{0}]", sheetName);
                    OleDbDataAdapter ada = new OleDbDataAdapter(sql, connstring);

                    ada.Fill(set);
                    set.Tables[i].TableName = sheetName;
                }

                return set;

            }
        }

在这里插入图片描述
搜索Excel,选择“Microsoft.Office.Interop.Excel”并安装
在这里插入图片描述
在这里插入图片描述
搜索“oledb”,选择并安装“System.Data.OleDb”
在这里插入图片描述
在这里插入图片描述
然后Form.cs的using部分,修改为如下内容

using Microsoft.Office.Interop.Excel;
using Microsoft.VisualBasic;
using Microsoft.VisualBasic.ApplicationServices;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Diagnostics;
using System.Diagnostics.Metrics;
using System.Drawing;
using DataTable = System.Data.DataTable;

3 画面启动,测试结果

在这里插入图片描述

3.1 生成如下的SQL文件

在这里插入图片描述

3.2 SQL文件(T_PLAYER_PICTURES.SQL)内容如下

/*
-- 作成表的中文名:选手定妆照表
-- 作成表的英文名:T_PLAYLER_PICTURES
-- 作成组织:无
-- 作成日期:2024/02/15
-- 作成者:烟图黛螺
-- 修改历史:2024/02/15 烟图黛螺 新建文件
*/

------- 永久删除表,不进入回收站 ----------
DROP TABLE T_PLAYLER_PICTURES PURGE;
/

------- 创建表 ----------
CREATE TABLE T_PLAYLER_PICTURES (
     INSTID         VARCHAR2(64 CHAR) NOT NULL
    ,INSTDT         DATE NOT NULL
    ,INSTTERM       VARCHAR2(50 CHAR) NOT NULL
    ,INSTPRGNM      VARCHAR2(50 CHAR) NOT NULL
    ,UPDTID         VARCHAR2(64 CHAR) NOT NULL
    ,UPDTDT         DATE NOT NULL
    ,UPDTTERM       VARCHAR2(50 CHAR) NOT NULL
    ,UPDTPRGNM      VARCHAR2(50 CHAR) NOT NULL
    ,PICTURENO      VARCHAR2(20 CHAR) NOT NULL
    ,NUM            NUMBER(3,0) DEFAULT 1 NOT NULL
    ,MEMBER_ID      VARCHAR2(5 CHAR) NOT NULL
    ,PICURL         VARCHAR2(100 CHAR) NOT NULL
    ,USEKBN         VARCHAR2(1 CHAR) DEFAULT 1 NOT NULL
);
/

------- 添加触发器 ----------
CREATE OR REPLACE TRIGGER TRG_T_PLAYLER_PICTURES BEFORE INSERT OR UPDATE ON T_PLAYLER_PICTURES FOR EACH ROW
DECLARE
    LV_USER VARCHAR2(64 CHAR);
    LV_CLIENTID VARCHAR2(64 CHAR);
    LV_PROGRAMNAME VARCHAR2(50 CHAR);
    LV_TERMINALINAL VARCHAR2(50 CHAR);
BEGIN
    LV_USER := SYS_CONTEXT('USERENV', 'SESSION_USER');
    LV_CLIENTID:= SYS_CONTEXT('USERENV', 'CLIENT_INFO');
    LV_PROGRAMNAME:= SYS_CONTEXT('USERENV', 'CLIENT_PROGRAM_NAME');
    LV_TERMINALINAL:= SYS_CONTEXT('USERENV', 'TERMINAL');

    IF NOT LV_CLIENTID IS NULL
        AND LENGTH(LV_CLIENTID) > 0
    THEN
        IF INSTR(LV_CLIENTID, ',') > 0
        THEN
            LV_USER := SUBSTR(LV_CLIENTID, 1, INSTR(LV_CLIENTID, ',') - 1);
            LV_PROGRAMNAME:= SUBSTR(LV_CLIENTID, INSTR(LV_CLIENTID, ',') + 1);

            IF INSTR(LV_PROGRAMNAME, ',') > 0
            THEN
                LV_TERMINALINAL := SUBSTR(LV_PROGRAMNAME, INSTR(LV_PROGRAMNAME, ',') + 1);
                LV_PROGRAMNAME:= SUBSTR(LV_PROGRAMNAME, 1, INSTR(LV_PROGRAMNAME, ',') - 1);
            END IF;
        ELSE
            LV_USER := LV_CLIENTID;
        END IF;
    ELSE
        LV_USER := LV_USER || ',' || LV_PROGRAMNAME;
    END IF;

    IF INSERTING
    THEN
        : new.INSTID := LV_USER;
        :new.INSTDT := sysdate;
        :new.INSTTERM := LV_TERMINALINAL;
        :new.INSTPRGNM := LV_PROGRAMNAME;
    END IF;

    IF INSERTING OR UPDATING
    THEN
        : new.UPDTID := LV_USER;
        :new.UPDTDT := sysdate;
        :new.UPDTTERM := LV_TERMINALINAL;
        :new.UPDTPRGNM := LV_PROGRAMNAME;
    END IF;
END;
/

-------添加主键索引----------
ALTER TABLE T_PLAYLER_PICTURES ADD CONSTRAINT PK_T_PLAYLER_PICTURES PRIMARY KEY (PICTURENO);
/

------- 添加约束条件 ----------
ALTER TABLE T_PLAYLER_PICTURES ADD CONSTRAINT CHECK_T_PLAYLER_PICTURES_NUM_1 CHECK(NUM >= 1);
/
ALTER TABLE T_PLAYLER_PICTURES ADD CONSTRAINT CHECK_T_PLAYLER_PICTURES_USEKBN_1 CHECK(USEKBN IN (0,1));
/

------- 添加表和列名的注释 ----------
COMMENT ON TABLE T_PLAYLER_PICTURES IS '选手定妆照表';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.INSTID IS '登陆者名';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.INSTDT IS '登陆时间';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.INSTTERM IS '登陆客户端名';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.INSTPRGNM IS '登陆程序名';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.UPDTID IS '更新者名';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.UPDTDT IS '更新时间';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.UPDTTERM IS '更新客户端名';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.UPDTPRGNM IS '更新程序名';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.PICTURENO IS '定妆照编号';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.NUM IS '连番';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.MEMBER_ID IS '人员ID';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.PICURL IS '选手照图片地址';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.USEKBN IS '背景作用';
/

3.3 最终生成的表结构

把上面生成的SQL,复制到SQL Developer中,执行SQL,在数据库中创建表
在这里插入图片描述
执行成功后,得到下面的表
在这里插入图片描述
前8列由触发器自动登录和更新数据,第9列以后才是用户登录的数据
在这里插入图片描述
到这里就完成了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1450977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

transformer-Attention is All You Need(一)

1. 为什么需要transformer 循环模型通常沿输入和输出序列的符号位置进行因子计算。通过在计算期间将位置与步骤对齐&#xff0c;它们根据前一步的隐藏状态和输入产生位置的隐藏状态序列。这种固有的顺序特性阻止了训练样本内的并行化&#xff0c;这在较长的序列长度上变得至关重…

Java中的Queue队列的基本讲解

目录 一、创建队列 二、Queue的一些常用方法 对于队列的概念我就不多说了吧&#xff0c;先进先出&#xff0c;比如1,2,3进入队列&#xff0c;出队列也是1,2,3。这里我主要说的是在Java中如何创建和使用队列。 一、创建队列 队列的创建&#xff0c;也可以说是队列的实例化。 Q…

精炼爆炸性新闻!OpenAI发布革命性AI视频生成模型Sora:实现长达60秒的高清视频创作「附AIGC行业系统搭建」

在人工智能领域&#xff0c;每一次技术革新都引领着未来的发展方向。OpenAI&#xff0c;作为全球领先的人工智能研究机构&#xff0c;再次证明了其在推动AI技术革新方面的领导地位。近日&#xff0c;OpenAI宣布推出了一款革命性的AI视频生成模型——Sora&#xff0c;这一大胆的…

Dart 3.3 发布:扩展类型、JavaScript Interop 等

参考链接&#xff1a;https://medium.com/dartlang/dart-3-3-325bf2bf6c13 跟随 Flutter 3.19 发布的还有 Dart 3.3 &#xff0c;Dart 3.3 主要包含扩展类型增强&#xff0c;性能优化和 native 代码交互推进&#xff0c;例如本次改进的JavaScript Interop 模型就引入了类型安全…

【lesson56】生产者消费者模型

文章目录 学习生产者消费者模型过程中要回答的两个问题生产者消费者模型的概念基于阻塞队列的生产者消费者模型编码实现Common.hLockGuard.hppCondtion.hppBlockQueue.hppTask.hppConProd.cc 学习生产者消费者模型过程中要回答的两个问题 1.条件变量是在条件满足的时候&#x…

使用 XML 和 YAML 文件的文件输入和输出

目标 您将找到以下问题的答案&#xff1a; 如何使用YAML或XML文件打印和读取文件和OpenCV的文本条目&#xff1f;如何对 OpenCV 数据结构做同样的事情&#xff1f;如何为您的数据结构执行此操作&#xff1f;使用 OpenCV 数据结构&#xff0c;例如 cv&#xff1a;&#xff1a;…

SolidWorks如何在一个零件的基础上绘制另一个零件

经过测试&#xff0c;新建零件&#xff0c;然后插入零件a&#xff0c;在a的基础上绘制b,这种做法无法断开a与b的联系。虽然可以通过切除命令&#xff0c;切除b&#xff0c;但不是正途。 在装配体中可以实现&#xff1a; &#xff08;1&#xff09;建立装配体 &#xff08;2&…

在线黑色响应式全屏滚动主页html源码

html5黑色大气的个人博客全屏滚动个人主页源码 右键记事本即可修改 直接上传服务器空间就可使用

【HTML】过年不能放烟花,那就放电子烟花

闲谈 大家回家过年可能都多多少少放过些&#x1f9e8;&#xff0c;但是有些在城市上过年的小伙伴可能就没有机会放鞭炮了。不过没关系&#xff0c;我们懂技术&#xff0c;我们用技术自娱自乐&#xff0c;放电子烟花&#xff0c;总不可能被警长叔叔敲门问候吧。 开干 首先&…

一个比SDXL更快的模型——Stable Cascade【必坑指北】

2024年的春节假期&#xff0c;AIGC界又发生了重大革命性事件。 OpenAI 发布了首款文生视频模型——Sora。简单来说就是&#xff0c;AI视频要变天了&#xff01;之前的SVD&#xff0c;还是Google的Lumiere最多就几十帧&#xff0c;大约十秒左右&#xff0c;但是Sora却是SOTA级别…

文生视频:Sora模型报告总结

作为世界模拟器的视频生成模型 我们探索视频数据生成模型的大规模训练。具体来说&#xff0c;我们在可变持续时间、分辨率和宽高比的视频和图像上联合训练文本条件扩散模型。我们利用对视频和图像潜在代码的时空补丁进行操作的变压器架构。我们最大的模型 Sora 能够生成一分钟…

BUGKU-WEB 网站被黑

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 提示说&#xff1a; 网站被黑了 黑客会不会留下后门&#xff08;那就是留了&#xff09;那就扫描目录先看看再说发现确实有登入界面&#xff0c;但是密码不知道&#xff08;爆破走起&#xff09; …

Matplotlib plt.plot:从入门到精通,只需一篇文章!

Matplotlib plt.plot&#xff1a;从入门到精通&#xff0c;只需一篇文章&#xff01; 利用Matplotlib进行数据可视化示例 &#x1f335;文章目录&#x1f335; &#x1f4ca; 1. 引言&#xff1a;为什么Matplotlib在数据可视化中如此重要&#xff1f;&#x1f4ca;✨ 2. plt.pl…

【LLM-RAG】BGE M3-embedding模型(模型篇|混合检索、多阶段训练)

note M3-Embedding联合了3种常用的检索方式&#xff0c;对应三种不同的文本相似度计算方法。可以基于这三种检索方式进行多路召回相关文档&#xff0c;然后基于三种相似度得分平均求和对召回结果做进一步重排。 多阶段训练过程&#xff1a; 第一阶段&#xff1a;第一阶段的自…

C语言希尔排序详解!!!速过

目录 希尔排序是什么&#xff1f; 关于时间复杂度 希尔排序的源代码 希尔排序源代码的详解 希尔排序是什么&#xff1f; 之前我们说了三个排序&#xff08;插入排序&#xff0c;选择排序&#xff0c;冒泡排序&#xff09;有需要的铁铁可以去看看之前的讲解。 但因为之前的…

政安晨:【示例演绎】【Python】【Numpy数据处理】快速入门(二)

环境准备 大家如果第一次看到&#xff0c;可以先从我这个演绎系列的第一篇文章开始&#xff0c;包括准备环境等等。 第一篇文章如下&#xff1a; 政安晨&#xff1a;【示例演绎】【Python】【Numpy数据处理】快速入门&#xff08;一&#xff09;https://blog.csdn.net/snowd…

结构体对齐规则及为什么会有结构体对齐

前言&#xff1a; 大家在学习结构体中&#xff0c;在计算结构体大小时想必会很疑惑&#xff0c;为什么结构体的大小不是按照常理像数组一样一个字节一个字节的挨在一起放&#xff1f;今天带大家一起深入探讨一下背后的规则和原因。 结构体对齐规则&#xff1a; 结构体对齐其实…

Kotlin基本语法2基本内置方法

1.Kotlin的可空性 fun main() {var str:String? "butterfly" //?问好代表可空类型str null } 安全的管理 1.1 安全操作调用符 fun main() {var str:String? "butterfly" //?问好代表可空类型str nullprintln(str?.capitalize())//当String为null时…

Windows11系统下对jar文件解压修改后在压缩为jar文件

一、准备内容 安装JAVA环境——若已安装则忽略 我这里以在Windows11中安装JAVA 的JDK8环境为例进行安装配置说明: 1.1、下载JDK安装包 Java Downloads | Oraclehttps://www.oracle.com/java/technologies/downloads/#java8-windows 1.2、安装JDK

流量主小程序/公众号h5开源代码 源码分享

小程序开源代码合集 1、网课搜题小程序源码/小猿题库多接口微信小程序源码自带流量主 搭建教程 1、微信公众平台注册自己的小程序 2、下载微信开发者工具和小程序的源码 3、上传代码到自己的小程序 界面截图&#xff1a; 开源项目地址&#xff1a;https://ms3.ishenglu.com…