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

目标:

用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列以后才是用户登录的数据
在这里插入图片描述
到这里就完成了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言第二十五弹---字符函数和字符串函数(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 目录 1、字符分类函数 2、字符转换函数 3、strlen的使用和模拟实现 4、strcpy 的模拟实现 5、strcat 的模拟实现 6、strcmp 的模拟实现 7、strncpy 函数的使用 总结…

高效货运 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 老李是货运公司承运人&#xff0c;老李的货车额定载货重量为wt&#xff1b;现有两种货物&#xff0c;货物A单件重量为wa&#xff0c;单件运费利润为pa&#xff0c…

Fluke ADPT 连接器新增对福禄克万用 Fluke 15B Max 的支持

所需设备&#xff1a; 1、Fluke ADPT连接器&#xff1b; 2、Fluke 15B Max&#xff1b; Fluke 15B Max拆机图&#xff1a; 显示界面如下图&#xff1a; 并且可以将波形导出到EXCEL: 福禄克万用表需要自己动手改造&#xff01;&#xff01;&#xff01;

【C++第二阶段-重载-关系运算符函数调用】

你好你好&#xff01; 以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 关系运算符-重载-判断相等函数调用运算符重载 关系运算符-重载-判断相等 场景&#xff1a;两个对象&#xff0c;若有年龄和性别的不同&#xff0c;是否可以直…

AI数据中心网络架构需求:400/800G光模块

随着AI技术和相关应用的不断发展&#xff0c;大模型、大数据和AI计算能力在AI发展中的重要性日益凸显。大模型和数据集构成AI研究的软件基础&#xff0c;而AI算力是关键的基础设施。在本文中&#xff0c;我们将探讨AI发展对数据中心网络架构的影响。 Fat-Tree数据中心网络架构…

Spring Boot结合MinIO 实现文件切片极速上传!

本文将介绍如何使用Spring Boot和MinIO实现文件切片极速上传技术&#xff0c;通过将大文件分割成小片段并并行上传&#xff0c;显著提高文件上传速度。 2 文件切片上传简介 文件切片上传是指将大文件分割成小的片段&#xff0c;然后通过多个请求并行上传这些片段&#xff0c;最…

【C++】实现Date类的各种运算符重载

上一篇文章只实现了operator操作符重载&#xff0c;由于运算符较多&#xff0c;该篇文章单独实现剩余所有的运算符重载。继续以Date类为例&#xff0c;实现运算符重载&#xff1a; 1.Date.h #pragma once#include <iostream> #include <assert.h>using namespace …

相机图像质量研究(24)常见问题总结:CMOS期间对成像的影响--摩尔纹

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

【面试】盘点10个高频的前端算法题,你全都会了吗?

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 现在前端的面试中&#xff0c;算法出现的频率越来越高了&#xff0c;大厂更是必考算…

GPIO八种工作模式

目录 一、推挽输出 二、开漏输出 三、复用推挽输出 四、复用开漏输出 五、浮空输入 六、上拉输入 七、下拉输入 八、模拟输入 GPIO八种配置模式&#xff0c;原理和使用场景&#xff0c;硬件原理如下图&#xff1a; 一、推挽输出 1、 原理 当控制栅极为低电平时&#x…

【Visual Studio】使用空格替换制表符

环境 VS版本&#xff1a;VS2013 问题 如何生成空格替换制表符&#xff1f; 步骤 1、菜单 工具->选项&#xff0c;文本编辑器->C/C->制表符&#xff0c;选择【插入空格】。

free pascal:fpwebview 组件通过 JSBridge 调用本机TTS

从 https://github.com/PierceNg/fpwebview 下载 fpwebview-master.zip 简单易用。 先请看 \fpwebview-master\README.md cd \lazarus\projects\fpwebview-master\demo\js_bidir 学习 js_bidir.lpr &#xff0c;编写 js_bind_speak.lpr 如下&#xff0c;通过 JSBridge 调用本…

php基础学习之可变函数(web渗透测试关键字绕过rce于回调函数)

可变函数 看可变函数的知识点之前&#xff0c;蒟蒻博主建议你先去看看php的可变变量&#xff0c;会更加方便理解&#xff0c;在本篇博客中的第五块知识点->php基础学习之变量-CSDN博客 描述 当一个变量所保存的值刚好是一个函数的名字&#xff08;由函数命名规则可知该值必…

挑战杯 python区块链实现 - proof of work工作量证明共识算法

文章目录 0 前言1 区块链基础1.1 比特币内部结构1.2 实现的区块链数据结构1.3 注意点1.4 区块链的核心-工作量证明算法1.4.1 拜占庭将军问题1.4.2 解决办法1.4.3 代码实现 2 快速实现一个区块链2.1 什么是区块链2.2 一个完整的快包含什么2.3 什么是挖矿2.4 工作量证明算法&…

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

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

Java实现实现自动化pdf打水印小项目 使用技术pdfbox、Documents4j

文章目录 前言源码获取一、需求说明二、 调研pdf处理工具word处理工具 三、技术栈选择四、功能实现实现效果详细功能介绍详细代码实现项目目录WordUtilsMain类实现部分&#xff1a;第一部分Main类实现部分&#xff1a;第二部分Main类实现部分&#xff1a;第三部分 资料获取 前言…

算法详解(力扣141——环形链表系列)

博主ID&#xff1a;代码小豪 文章目录 环形链表环形链表的性质分析快慢指针法指针的追及相遇问题 环形链表&#xff08;2&#xff09; 环形链表 先来看看环形链表的原题&#xff1a; 中间的部分叙述有点繁杂&#xff0c;简单来概括就是&#xff0c;假如有一个节点&#xff0c…

SAP PP学习笔记- 豆知识01 - 怎么查询既存品目

SAP系统当中已经有哪些品目要怎么查询呢&#xff1f; 1&#xff0c;MM60 品目一览 这里可以输入Plant&#xff0c;然后可以查询该工厂的所有品目。 2&#xff0c;SE16 > MARA MARA 品目一般Data&#xff0c;存放的是品目基本信息。 如果要查询该品目属于哪个Plant&#x…

【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——计算机网络

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 2. 计算机网络 1. TCP如何解决丢包和乱序&#xff1f; 序列号&#xff1a;TCP所传送的每段数据都有标有序列号&#xff0c;避免乱序问题发送端确认应答、超时…

[01] Vue2学习准备

目录 vue理解创建实例插值表达式 {{}}响应式特性 vue理解 Vue.js 是一套构建用户界面的渐进式框架。 Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 创建实例 准备容器 <div id…