Here’s an interesting, slightly opinionated review of VB.NET billing software source code — written from the perspective of a developer or small business owner evaluating such a solution.
Secure authentication using salt-hash (simplified here for demo).
Public Class LoginForm Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click Dim username As String = txtUsername.Text Dim password As String = txtPassword.Text Dim query As String = $"SELECT Role FROM tbl_Users WHERE Username='username' AND Password='password'" Dim dt As DataTable = ExecuteQuery(query)If dt.Rows.Count > 0 Then Dim role As String = dt.Rows(0)("Role").ToString() Dim mainForm As New MainDashboard(role, username) mainForm.Show() Me.Hide() Else MessageBox.Show("Invalid credentials!") End If End Sub
End Class
Security Note: Never store plain passwords in production. Use
SHA256hashing.
Billing software is data-heavy. Look for a project that uses SQL Server (Express or Standard). The code should demonstrate:
The following code demonstrates the transaction process—inserting the invoice header and items, and updating stock atomically. vbnet+billing+software+source+code
Imports System.Data.SqlClient
Public Class InvoiceService
Private dbHelper As New DatabaseHelper()
Public Function CreateInvoice(customerId As Integer, items As List(Of InvoiceItem)) As Boolean
Dim queryInvoice As String = "INSERT INTO tbl_Invoices (Date, CustomerID, TotalAmount) VALUES (@Date, @CID, @Total); SELECT SCOPE_IDENTITY();"
Dim queryItem As String = "INSERT INTO tbl_InvoiceItems (InvoiceID, ProductID, Quantity, UnitPrice) VALUES (@IID, @PID, @Qty, @Price);"
Dim queryUpdateStock As String = "UPDATE tbl_Products SET StockQty = StockQty - @Qty WHERE ProductID = @PID;"
Using conn As SqlConnection = dbHelper.GetConnection()
conn.Open()
Dim transaction As SqlTransaction = conn.BeginTransaction()
Try
Dim totalAmount As Decimal = items.Sum(Function(i) i.Total)
Dim invoiceId As Integer
' 1. Insert Invoice Header
Using cmd As New SqlCommand(queryInvoice, conn, transaction)
cmd.Parameters.AddWithValue("@Date", DateTime.Now)
cmd.Parameters.AddWithValue("@CID", customerId)
cmd.Parameters.AddWithValue("@Total", totalAmount)
invoiceId = Convert.ToInt32(cmd.ExecuteScalar())
End Using
' 2. Insert Items and Update Stock
For Each item In items
' Insert Item
Using cmd As New SqlCommand(queryItem, conn, transaction)
cmd.Parameters.AddWithValue("@IID", invoiceId)
cmd.Parameters.AddWithValue("@PID", item.ProductID)
cmd.Parameters.AddWithValue("@Qty", item.Quantity)
cmd.Parameters.AddWithValue("@Price", item.UnitPrice)
cmd.ExecuteNonQuery()
End Using
' Update Stock
Using cmd As New SqlCommand(queryUpdateStock, conn, transaction)
cmd.Parameters.AddWithValue("@Qty", item.Quantity)
cmd.Parameters.AddWithValue("@PID", item.ProductID)
cmd.ExecuteNonQuery()
End Using
Next
transaction.Commit()
Return True
Catch ex As Exception
transaction.Rollback()
' Log error
Return False
End Try
End Using
End Function
End Class
If you are searching for "VB.NET billing software source code," be careful of "spaghetti code" repositories. Here are reliable places to look:
Add a PrintDocument and PrintPreviewDialog control to the form. Then handle the PrintPage event.
Private Sub btnPrint_Click(sender As Object, e As EventArgs) Handles btnPrint.Click PrintPreviewDialog1.Document = PrintDocument1 PrintPreviewDialog1.ShowDialog() End SubPrivate Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim fontTitle As New Font("Arial", 18, FontStyle.Bold) Dim fontBody As New Font("Arial", 10) Dim yPos As Single = e.MarginBounds.Top Dim leftMargin As Single = e.MarginBounds.Left Here’s an interesting, slightly opinionated review of VB
e.Graphics.DrawString("TAX INVOICE", fontTitle, Brushes.Black, leftMargin, yPos) yPos += 40 e.Graphics.DrawString("Invoice No: " & txtInvoiceNo.Text, fontBody, Brushes.Black, leftMargin, yPos) yPos += 20 e.Graphics.DrawString("Date: " & txtInvoiceDate.Text, fontBody, Brushes.Black, leftMargin, yPos) yPos += 30 ' Draw headers e.Graphics.DrawString("Item", fontBody, Brushes.Black, leftMargin, yPos) e.Graphics.DrawString("Qty", fontBody, Brushes.Black, leftMargin + 200, yPos) e.Graphics.DrawString("Rate", fontBody, Brushes.Black, leftMargin + 300, yPos) e.Graphics.DrawString("Amount", fontBody, Brushes.Black, leftMargin + 400, yPos) yPos += 20 For Each row As DataRow In dtDetails.Rows e.Graphics.DrawString(row("ProductName").ToString(), fontBody, Brushes.Black, leftMargin, yPos) e.Graphics.DrawString(row("Quantity").ToString(), fontBody, Brushes.Black, leftMargin + 200, yPos) e.Graphics.DrawString(row("Rate").ToString(), fontBody, Brushes.Black, leftMargin + 300, yPos) e.Graphics.DrawString(row("TaxableValue").ToString(), fontBody, Brushes.Black, leftMargin + 400, yPos) yPos += 20 Next yPos += 20 e.Graphics.DrawString("Total: " & lblGrandTotal.Text, New Font("Arial", 12, FontStyle.Bold), Brushes.Black, leftMargin + 350, yPos)
End Sub
This is where most amateur code fails. A billing system must be ACID compliant. When a customer clicks "Save Invoice," the code must: End Class