TechnitiumSoftware/DnsServer · error · Exception

Please specify a valid connection string in…

Error message

Please specify a valid connection string in 'connectionString' parameter.

What it means

QueryLogsSqlServerApp needs a SQL Server connection string to operate. The 'connectionString' property is read with a null default; this error fires when it is missing or null, before any SqlConnection is constructed. The app cannot persist DNS query logs without server coordinates.

Solutions

  1. Populate 'connectionString' in dnsApp.config with server/auth info, e.g. 'Server=localhost;User Id=sa;Password=pass;'.
  2. Do NOT add 'Initial Catalog' (see error 44); use 'databaseName' for the schema.
  3. Restart the DNS server/app so ApplyConfig reloads the corrected config.

Example fix

// before
"connectionString": null

// after
"connectionString": "Server=localhost;User Id=sa;Password=pass;TrustServerCertificate=true;"
Defensive patterns

Strategy: validation

Validate before calling

static void EnsureSqlServerConnectionString(string? cs)
{
    if (string.IsNullOrWhiteSpace(cs))
        throw new InvalidOperationException(
            "'connectionString' is missing. Set a SQL Server connection string.");
}

EnsureSqlServerConnectionString(connectionString);

Prevention

When it happens

Trigger: ApplyConfig is called with a JSON config lacking the 'connectionString' property or with it set to null. The null guard throws immediately.

Common situations: Newly added SqlServer query-log app whose config was never populated; a manual config edit that removed the line; or a templating/CI step that emitted an empty connectionString.

Related errors


AI-assisted analysis of TechnitiumSoftware/DnsServer@d0484b6c1e (2026-08-13). Data as JSON: /api/errors/9f4ed1bf4b879fd4. Report an issue: GitHub.

Appendix: source

Thrown at Apps/QueryLogsSqlServerApp/App.cs:369

            try
            {
                _dnsServer = dnsServer;

                if (config is null)
                    throw new InvalidOperationException();

                using JsonDocument jsonDocument = JsonDocument.Parse(config, _jsonParseOptions);
                JsonElement jsonConfig = jsonDocument.RootElement;

                bool enableLogging = jsonConfig.GetPropertyValue("enableLogging", false);
                int maxQueueSize = jsonConfig.GetPropertyValue("maxQueueSize", 1000000);
                _maxLogDays = jsonConfig.GetPropertyValue("maxLogDays", 0);
                _maxLogRecords = jsonConfig.GetPropertyValue("maxLogRecords", 0);
                _databaseName = jsonConfig.GetPropertyValue("databaseName", "DnsQueryLogs");
                _connectionString = jsonConfig.GetPropertyValue("connectionString", null);

                if (_connectionString is null)
                    throw new Exception("Please specify a valid connection string in 'connectionString' parameter.");

                if (_connectionString.Contains("Initial Catalog", StringComparison.OrdinalIgnoreCase))
                    throw new Exception("The 'connectionString' parameter must not define 'Initial Catalog'. Configure the 'databaseName' parameter above instead.");

                if (!_connectionString.TrimEnd().EndsWith(';'))
                    _connectionString += ";";

                async Task ApplyConfig()
                {
                    if (enableLogging)
                    {
                        await using (SqlConnection connection = new SqlConnection(_connectionString))
                        {
                            await connection.OpenAsync();

                            await using (SqlCommand command = connection.CreateCommand())
                            {
                                command.CommandText = @$"

View on GitHub (pinned to d0484b6c1e)